К примеру, мы можем скомпилировать программу с помощью 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 не меняется.
Но если вы найдете пример, где все-таки меняется - пишите.