Гарантировать размер объекта в агрегации

_NN_
_NN_

Допустим мы имеем простую обёртку над указателем.

template<typename T>
struct ptr
{
 T* p;
};

Компилятор вправе добавить выравнивание по его усмотрению

template<typename T>
struct ptr
{
 T* p;
 // padding
};

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

class X
{
 ptr<int> p; 
 // внутреннее выравнивание ptr<int>
 // выравнивание для поля p
};

Получатся, что использование указателя меньше влияет на размер класса чем использование обёртки вокруг него.


Предложение:

Атрибут указывающий не добавлять лишнего выравнивания для таких классов таким образом гарантирующей легковестность любой обёртки то бишь array, unique_ptr и т.п.

template<typename T>
struct ptr [[raw_size]]
{
 T* p;
 // guaranteed no padding is added
};
-1
рейтинг
9 комментариев
Дмитрий

Мной поднимался аналогичный вопрос: https://stdcpp.ru/proposals/41501203-8dad-4a62-95a4-a34bfd5a52c2

Дмитрий
Обновлено 
_NN_

Дмитрий, Похоже на то. inline вместо атрибута тоже неплохой вариант. Похоже, что люди так и не поняли зачем это надо.

_NN_
asschool

Кажется паддинг в классе с одним членом это проблема реализации а не стандарта

А упаковка ведет к более медленному коду

asschool
_NN_

asschool, Как код будет медленнее ?

Всего лишь требуется гарантированно не добавлять выравнивание там , где оно итак не нужно.

 

Мне нужно обеспечить структуры B и C, чтобы лежали в памяти одинаково.

Если нужно выравание после int это не проблема. Пусть хоть будет в памяти:

i 4байта
выравнивание 4байта
c 1байт
выравнивание 7байта

 

 

struct A { int i; };

struct B
{
 A a;
 char c;
};

struct B2
{
 int i;
 char c;
}
_NN_
asschool

_NN_, для чего вам эта гарантия в стандарте?

asschool
_NN_

asschool, Мне не нужна гарантия повсеместно. Мне нужно только в случаях, которые я укажу явно.
Нужно, чтобы, например, поле unique_ptr<int> всегда занимало размер intptr_t, а не intptr_t + возможное выравнивание

_NN_
asschool

_NN_, а содержимое unique_ptr уже описано в стандарте?

asschool
_NN_

asschool, Это же пример. Пусть будет struct my_ptr<T> { T* ptr; };

_NN_
Илья

Есть правило - поля в памяти выравниваются по границе кратной своему же размеру.

_NN_, приведите пожалуйста sizeof(int), sizeof(A), sizeof(B) и sizeof(B2) в сценарии, когда по вашему мнению добавляется лишний паддинг.

Илья
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения