Обычный способ обеспечить размер класса — добавить отступ соответствующего размера:
class C
{
int foo;
uint8_t padding[PADDINGSIZE];
};
Затем sizeof(C)
можно также проверить с помощью static_assert
.
Но это неудобно. Есть ли надежное решение для принудительного применения sizeof(C)
к определенному значению с дополнением или без него, но без необходимости указывать PADDINGSIZE
?
3 ответа
Вероятно, лучшим вариантом будет использование union
. Грубо говоря, без некоторых деталей:
class C
{
int foo;
};
union CAlloc
{
C instance;
std::byte enforced_size[DESIRED_SIZE];
};
Затем используйте CAlloc::instance
, где это необходимо.
Обновление: как указал @Mgetz в комментариях, std::byte
является дополнением С++ 17, вам может понадобиться/нужно использовать char
, если вы используете более старый стандарт.
В C++11 появилось новое ключевое слово: alignas Я думаю, что это нечто большее. удобно с вашей точки зрения.
В общем я бы сказал, что невозможно обеспечить определенный размер класса.
Рассмотрим желаемый размер 13. int foo; uint8_t padding[13 - sizeof(int)];
не сделает класс размером 13, так как после .padding[]
обязательно произойдет заполнение.
Желаемый PADDINGSIZE
должен будет соответствовать условиям, зависящим от предыдущих членов в классе и минимальных требований к выравниванию класса. Конечно есть минимум, т.к. uint8_t padding[some_negative];
работать не будет.
Рассмотрим ниже, где PADDINGSIZE + 7
может быть кратным 8, чтобы избежать заполнения после .padding[]
.
class C2 {
int foo;
double d;
int uint8_t b[1];
uint8_t padding[PADDINGSIZE];
}
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
static_assert
, чтобы компилятор предупредил вас, если предполагаемое решение не работает должным образом.