Как контролировать размер класса, чтобы он был кратен размеру члена?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как контролировать размер класса, чтобы он был кратен размеру члена?

Сообщение Anonymous »


У меня есть следующий класс

структура сотрудника { 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)) ]; }; Обратите внимание, что теперь формула стала еще хуже.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»