Имеют ли реализации кортежей оптимизированный макет?

во время чтения этой Я был поражен тем, что определенный уровень метапрограммирования может сделать для вашего макета класса. Должен признаться, что я не совсем понимаю, каков предлагаемый оптимальный макет, если бы мне пришлось изложить то, что я понял, это было бы так :

упорядочение члена класса по убыванию, т. е. тип с наибольшим alignof результат идет первым etc

Не стесняйтесь поправлять меня, если я ошибся (если у вас был короткий объяснение, почему это происходит, было бы еще лучше, я не мог скопировать вставить большие куски обоснования в мой вопрос), но мой вопрос на другую тему:

делает любую реализацию библиотеки std::tuple есть такая оптимизация макета?

Если нет, существуют ли стандартные алгебраические типы данных, которые делают это, есть ли другой способ сделать это для моего класса, кроме написания таких машин ?

1 ответов


нет реализации библиотеки, о которой я знаю, оптимизирует макет для выравнивания. Вы можете использовать такую программу для проверки tuple планировка:

#include <iostream>
#include <tuple>

struct empty {};

int
main()
{
    using T = std::tuple<double, int, empty, short, long>;
    T t{};
    std::cout << &t << '\n';
    std::cout << &std::get<0>(t) << '\n';
    std::cout << &std::get<1>(t) << '\n';
    std::cout << &std::get<2>(t) << '\n';
    std::cout << &std::get<3>(t) << '\n';
    std::cout << &std::get<4>(t) << '\n';
    std::cout << &t+1 << '\n';
    std::cout << sizeof(T) << '\n';
}

libc++ хранит элементы в порядке объявления и оптимизирует пространство для пустых членов. Пустые члены направляются на фронт. Выход образца:

0x7fff5ccf39f8
0x7fff5ccf39f8
0x7fff5ccf3a00
0x7fff5ccf39f8
0x7fff5ccf3a04
0x7fff5ccf3a08
0x7fff5ccf3a10
24

libstdc++ хранит элементы в обратном порядке объявления и оптимизирует пространство для пустых членов. Пустые члены shunted к перед. Выход образца:

0x7ffe4fc5b2a0
0x7ffe4fc5b2b0
0x7ffe4fc5b2ac
0x7ffe4fc5b2a0
0x7ffe4fc5b2a8
0x7ffe4fc5b2a0
0x7ffe4fc5b2b8
24

VS-2015 сохраняет элементы в обратном порядке объявления и не оптимизирует пространство для пустых членов. Выход образца:

0306FEF4
0306FF04
0306FF00
0306FEFC
0306FEF8
0306FEF4
0306FF0C
24

в этом примере мы видим, что оптимизация пространства для пустого члена ничего не купила, так как он все равно вписывается в область заполнения.

никакие средства которые автоматизируют задачу уменьшения прокладки в стандарте.