Дополнение структуры до точного размера - PullRequest
0 голосов
/ 18 мая 2018

Рассмотрим следующее struct определение:

#define SIZE ...  // it's a positive multiple of sizeof(Foo*)

struct Foo {
  Foo* ptr;
  char padding[SIZE - sizeof(Foo*)];
};

Учитывая, что SIZE является положительным кратным размеру указателя (sizeof(Foo*)), гарантируется ли стандартом sizeof(Foo) == SIZE?

Если это практически не гарантируется, существуют ли какие-либо общие платформы, которые предоставляют контрпример (где равенство не выполняется)?


Да, я в курсе alignas ...

1 Ответ

0 голосов
/ 18 мая 2018

Нет никаких гарантий относительно заполнения.

C++ Standard (working draft n4741) 6.7(4) Types

4 The object representation of an object of type T is the sequence of N 
unsigned char objects taken up by the object of type T, where N equals 
sizeof(T). The value representation of an object is the set of bits that 
hold the value of type T. Bits in the object representation that are not 
part of the value representation are padding bits. For trivially copyable 
types, the value representation is a set of bits in the object 
representation that determines a value, which is one discrete element of 
an implementation-defined set of values. (41)

(41) The intent is that the memory model of C++ is compatible with that 
of ISO/IEC 9899 Programming Language C.

C++ Standard (working draft n4741) 8.5.2.3(2) Sizeof

When applied to a reference or a reference type, the result is the size 
of the referenced type. When applied to a class, the result is the 
number of bytes in an object of that class including any padding required 
for placing objects of that type in an array. The result of applying 
sizeof to a potentially-overlapping subobject is the size of the type, 
not the size of the subobject.78 When applied to an array, the result is 
the total number of bytes in the array. This implies that the size of an 
array of n elements is n times the size of an element.

Я не могу указать ни на один пример, где бы он не хранился, но основывался на совместимости модели памяти стандарта.с "языком программирования ISO / IEC 9899 C" не может быть никаких гарантий относительно заполнения - это реализация, определенная .

...