Как контролировать размер класса, чтобы он был кратен размеру члена? ⇐ C++
Как контролировать размер класса, чтобы он был кратен размеру члена?
У меня есть следующий класс
структура сотрудника { std::имя строки; короткая зарплата; std::size_t возраст; }; Например, в Linux amd64 размер структуры составляет 48 байт, а размер std::string — 32, то есть не кратен.
Теперь мне нужно, чтобы кросс-платформенный способ, чтобы employee имел размер, кратный размеру std::string (первый член ).
(Кроссплатформенность может означать, например, Linux amd64 и Apple ARM.)
То есть sizeof(employee) % sizeof(std::string) == 0.
Я пытался управлять заполнением с помощью alignas для всего класса или его членов, но требование иметь степень 2, кажется, слишком строгое.
Затем я попытался добавить в конец массив char. Тем не менее, у меня было две проблемы: во-первых, каков точный размер массива на разных платформах во время компиляции, и, во-вторых, не добавить еще один член, который может испортить хорошую агрегатную инициализацию класса.
Во-первых, я делаю это:
struct сотрудник_dummy { std::имя строки; короткая зарплата; std::size_t возраст; }; структурировать сотрудника { std::имя строки; короткая зарплата; std::size_t возраст; заполнение символов [(sizeof(employee_dummy)/sizeof(std::string)+1)*sizeof(std::string) - sizeof(employee_dummy)]; }; Обратите внимание на уродливый фиктивный класс, и я даже не знаю, верна ли логика.
Для второй проблемы у меня нет решения. Я мог бы сделать это, но тогда мне нужно было бы добавить конструктор, класс не был бы агрегатом и т. д.
структура сотрудника { std::имя строки; короткая зарплата; std::size_t возраст; частный: заполнение символов [(sizeof(employee_dummy)/sizeof(std::string)+1)*sizeof(std::string) - sizeof(employee_dummy)]; }; Как я могу контролировать размер структуры с помощью стандартных или нестандартных механизмов и сохранять класс как агрегат?
Вот ссылка, где можно решить эту проблему эмпирически: https://cppinsights.io/s/f2fb5239
ДОБАВЛЕНО:
Я понял, что если метод добавления отступов верен, то расчет становится еще сложнее, поскольку фиктивный класс уже может добавлять отступы, поэтому вместо этого мне придется учитывать смещение последнего элемента.
>
В этом примере я хочу, чтобы data было кратно первому члену (std::complex):
struct dummy { std::complex a; двойная б; станд::int64_t b2; интервал с; }; структура данных { std::complex a; двойная б; станд::int64_t b2; интервал с; char padding[ ((offsetof(dummy, c) + sizeof(c)) / sizeof(std::complex) + 1)* sizeof(std::complex) - (offsetof(dummy, c) + sizeof(c)) ]; }; Обратите внимание, что теперь формула стала еще хуже.
У меня есть следующий класс
структура сотрудника { std::имя строки; короткая зарплата; std::size_t возраст; }; Например, в Linux amd64 размер структуры составляет 48 байт, а размер std::string — 32, то есть не кратен.
Теперь мне нужно, чтобы кросс-платформенный способ, чтобы employee имел размер, кратный размеру std::string (первый член ).
(Кроссплатформенность может означать, например, Linux amd64 и Apple ARM.)
То есть sizeof(employee) % sizeof(std::string) == 0.
Я пытался управлять заполнением с помощью alignas для всего класса или его членов, но требование иметь степень 2, кажется, слишком строгое.
Затем я попытался добавить в конец массив char. Тем не менее, у меня было две проблемы: во-первых, каков точный размер массива на разных платформах во время компиляции, и, во-вторых, не добавить еще один член, который может испортить хорошую агрегатную инициализацию класса.
Во-первых, я делаю это:
struct сотрудник_dummy { std::имя строки; короткая зарплата; std::size_t возраст; }; структурировать сотрудника { std::имя строки; короткая зарплата; std::size_t возраст; заполнение символов [(sizeof(employee_dummy)/sizeof(std::string)+1)*sizeof(std::string) - sizeof(employee_dummy)]; }; Обратите внимание на уродливый фиктивный класс, и я даже не знаю, верна ли логика.
Для второй проблемы у меня нет решения. Я мог бы сделать это, но тогда мне нужно было бы добавить конструктор, класс не был бы агрегатом и т. д.
структура сотрудника { std::имя строки; короткая зарплата; std::size_t возраст; частный: заполнение символов [(sizeof(employee_dummy)/sizeof(std::string)+1)*sizeof(std::string) - sizeof(employee_dummy)]; }; Как я могу контролировать размер структуры с помощью стандартных или нестандартных механизмов и сохранять класс как агрегат?
Вот ссылка, где можно решить эту проблему эмпирически: https://cppinsights.io/s/f2fb5239
ДОБАВЛЕНО:
Я понял, что если метод добавления отступов верен, то расчет становится еще сложнее, поскольку фиктивный класс уже может добавлять отступы, поэтому вместо этого мне придется учитывать смещение последнего элемента.
>
В этом примере я хочу, чтобы data было кратно первому члену (std::complex):
struct dummy { std::complex a; двойная б; станд::int64_t b2; интервал с; }; структура данных { std::complex a; двойная б; станд::int64_t b2; интервал с; char padding[ ((offsetof(dummy, c) + sizeof(c)) / sizeof(std::complex) + 1)* sizeof(std::complex) - (offsetof(dummy, c) + sizeof(c)) ]; }; Обратите внимание, что теперь формула стала еще хуже.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Использование члена класса в качестве аргумента по умолчанию для функции члена
Anonymous » » в форуме C++ - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-