TGViewer
C++: Хроники Дурки🚑 C++: Хроники Дурки🚑 @cpp_durka · 916 subscribers
Post #32 758
Сегодняшнее интересное меганаблюдение посвящено выбору стандартной библиотеки.

К примеру, мы можем скомпилировать программу с помощью clang двумя командами:


clang++ -O2 -std=c++20 -stdlib=libstdc++
clang++ -O2 -std=c++20 -stdlib=libc++

Это дело подключит разные реализации std. По идее, то, что регламентируется стандартом отличаться не должно (но тут, как мы знаем, всякое бывает)

Например, вот такой код


struct A {
int i;
bool operator<(const A& other) const {
return i < other.i;
}
};

struct B {
int i;
bool operator<(const B& other) const {
return i < other.i;
}
};

int main() {

const auto first = std::make_tuple(A{1}, B{4});
const auto second = std::make_tuple(A{2}, B{3});

std::cout << ((first < second) ? "less" : "more") << std::endl;
std::cout << ((std::get<0>(first) < std::get<0>(second)) ? "less" : "more") << std::endl;


В обоих случаях выведет одинаковое:


less


Но если мы попробуем забуриться во внутреннее устройство, например, глянуть в каком порядке хранятся структурки внутри тупла:


const int* const pf = reinterpret_cast<const int* const> (&first);
const int* const ps = reinterpret_cast<const int* const> (&second);

std::cout << pf[0] << ' ' << pf[1] << std::endl;
std::cout << ps[0] << ' ' << ps[1] << std::endl;

std::cout << (pf[0] < ps[0] ? "less" : "more") << std::endl;


То увидим внезапное

На libstdc++


3 2
more


На libc++


2 3
less


Тоесть libstdc++ хранит реальные значения в обратном порядке... Хотя get<0> вычисляет так, как мы того и ожидаем. И это может иметь всякие неожиданные последствия для, например, производительности.

Однако, см предыдущий пост, это как минимум не должно сказаться на размере структур данных. Потому что разворотом порядка членов padding не меняется.

Но если вы найдете пример, где все-таки меняется - пишите.
godbolt.org Compiler Explorer - C++ struct A { int i; bool operator<(const A& other) const { return i < other.i; } }; struct B { int i; bool operator<(const B& other) const { return i < other.i; } }; int main() { const auto first = std::make_tuple(A{1}…
  • ❤ 1
More from @cpp_durka
  1. Sep 8, 2026Мошенники заставили пенсионерку из Москвы переписать квартиру на Rust
  2. Aug 31, 2026Всяко разное болезненное есть в С++, из всего болезненного одно из самых болезненных - это…
  3. Aug 24, 2026Если кто не знаком с библиотекой nlohmann/json - она прекрасна. Мои мысли о том, как должн…
  4. Aug 21, 2026#толькосвоимемы Код взят тут. if (dim == 0) idx_dim = i0; else if (dim == 1) idx_dim = i1;…
  5. Aug 17, 2026Ладно, искать баги в компиляторах весело, но недостаточно. Давайте поиграемся в чуть более…
  6. Aug 10, 2026Ладно, разумеется прошлый пост был набросом. Никогда не обновляйте компиляторы без очень с…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →