Выравнивание размера структуры C
================================

Я хочу, чтобы размер структуры C был кратным 16 байтам (16B / 32B / 48B / ..).
Неважно, к какому размеру он подходит, он должен быть кратным 16B.
Как я могу заставить компилятор сделать это?
Благодарю.

 их типов и их количества. На самом деле не существует стандартного способа заставить компилятор создавать структуры, кратные некоторому размеру. Некоторые компиляторы предоставляют прагму, которая позволит вам установить границу выравнивания, однако это действительно другая вещь. И могут быть некоторые, которые будут иметь такую обстановку или обеспечить такую прагму.

Однако, если вы настаиваете на этом, одним из методов будет выделение памяти структуры и принудительное округление памяти до следующих 16-байтовых размеров.

Так что, если у вас была такая структура.

Тогда вы могли бы сделать что-то вроде следующего.

Что бы это сделать, это увеличить размер до следующих 16 байтов, насколько вам было интересно. Однако то, что делает распределитель памяти, может или не может дать вам блок, который на самом деле такого размера. Блок памяти может быть больше вашего запроса.

Если вы собираетесь сделать что-то особенное с этим, например, скажем, что вы собираетесь записать эту структуру в файл и хотите узнать размер блока, то вам придется делать те же вычисления, что и в malloc (). чем с помощью оператора sizeof () для расчета размера структуры.

Следующим шагом будет написание собственного оператора sizeof () с использованием макроса, такого как.

Насколько я знаю, нет надежного метода для извлечения размера выделенного блока из указателя. Обычно указатель имеет блок выделения памяти, который используется функциями управления кучей памяти, который будет содержать различную информацию управления памятью, такую как размер выделенного блока, который может фактически превышать запрошенный объем памяти. Однако формат этого блока и его местоположение относительно фактического предоставленного адреса памяти будет зависеть от времени выполнения компилятора C.



Для GCC:

Пример:

составлено с`gcc -o main main.c` будет выводить`16`, То же самое касается других компиляторов.



 поскольку выравнивание не указано глубоко в стандарте ISO C (оно указывает, что выравнивание может происходить по заданию компилятора, но не вдавается в подробности о том, как его применять).

Вам нужно изучить специфические для реализации вещи для вашей цепочки инструментов компилятора. Это может обеспечить`#pragma pack` (или же`align` или что-то другое), что вы можете добавить к определению вашей структуры.

Это может также обеспечить это как расширение языка. Например, gcc позволяет добавлять атрибуты к определению, один из которых управляет выравниванием:



 вы могли бы создать двойную структуру, заключив вашу фактическую структуру во вторую, которая может добавить заполнение

Затем вы можете работать с дополненной структурой:

Конечно, вы можете использовать тот факт, что первый член структуры начинается с 0 байтов, с которого начинается структура, и обрабатывать указатель на`struct payload_padded` как будто это указатель на`struct payload` (потому что это так):