Допустим вам требуется вручную выровнять все поля структуры по 4 байта. Выглядит это примерно так:
#pragma pack(push,1) //Или что-то аналогичное
//...
struct S{
uint8_t a;
uint8_t pad1; //Выравнивание
uint16_t pad2; //Выравнивание
uint32_t b;
};
Теперь вопрос. Какие еще есть способы добиться того-же результата? Атрибуты компилятора, какие-нибудь новые возможности языка(С++11, 14, 17, 20), трюки с битовыми полями?
В стандарте С++ есть в разделе 3.11 alignof
и в 7.6.2 - alignas
, т.е. вроде бы можно указать что-то типа struct alignas(8) S { ... };
, но (чисто мое мнение) описано оно не очень внятно, что лично я по привычке использую средства компилятора.
В Visual C++, например, это (помимо ключика /Zp
) #pragma pack
, обеспечивающая тонкую настройку выравнивания - вплоть до отдельных структур.
Вот такой код в VC++ 2015
#include <iostream>
#include <iomanip>
using namespace std;
struct alignas(16) S16
{
char a;
int b;
char c;
int d;
};
struct alignas(4) S4
{
char a;
int b;
char c;
int d;
};
#pragma pack(push,1)
struct S1
{
char a;
int b;
char c;
int d;
};
#pragma pack(pop)
#pragma pack(push,2)
struct S2
{
char a;
int b;
char c;
int d;
};
#pragma pack(pop)
int main(int argc, const char * argv[])
{
cout << "sizeof(S16) = " << sizeof(S16) << endl;
cout << "sizeof(S4) = " << sizeof(S4) << endl;
cout << "sizeof(S2) = " << sizeof(S2) << endl;
cout << "sizeof(S1) = " << sizeof(S1) << endl;
}
дает
sizeof(S16) = 16
sizeof(S4) = 16
sizeof(S2) = 12
sizeof(S1) = 10
Один из вариантов это использовать свойства битовых полей:
struct S{
uint8_t a;
uint32_t :0; //Выравнивание до границы 32-битного поля
uint32_t b;
};
Неименованное битовое поле нулевой длинны заставляет компилятор "сделать отступ" до границы поля заданного типа.
The special unnamed bit field of size zero can be forced to break up padding. It specifies that the next bit field begins at the beginning of its allocation unit.
Я, правда, немного сомневаюсь в переносимости этого решения. Но, вроде, работает
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть такой вот участок кода, который читае полученные AJAX данный в JSON формате(лишний код убран):