强制 C++ class 具有对齐的属性
Force a C++ class to have aligned attributes
考虑这个 class:
class C3
{
public:
uint16_t p1;
uint16_t p2;
uint8_t p3;
};
sizeof(C3)
是 6
。是否有任何编译器例程可以绕过对齐并强制其大小为 5
?我尝试使用 alignas
但没有成功...
使用 MSVC
编译器(您已包含 VS-2015 标记),您可以使用 #pragma pack
指令为 类 和结构设置填充选项。这也允许您 save/restore 'default' 设置,使用 push
和 pop
选项。
以下简短示例演示了这一点:
#include <iostream>
class C3 {
public:
uint16_t p1;
uint16_t p2;
uint8_t p3;
};
#pragma pack(push, 1) // Save current packing and set to single-byte
class C4 {
public:
uint16_t p1;
uint16_t p2;
uint8_t p3;
};
#pragma pack(pop) // Restore saved packing
class C5 {
public:
uint16_t p1;
uint16_t p2;
uint8_t p3;
};
int main()
{
std::cout << sizeof(C3) << std::endl; // 6
std::cout << sizeof(C4) << std::endl; // 5
std::cout << sizeof(C5) << std::endl; // 6 (again)
return 0;
}
许多其他编译器支持指令等同于 MSVC #pragma pack
。
类似于 Adrian 的回答,您也可以为某些可能不支持 #pragma pack
:
的编译器做
class C3
{
public:
uint16_t p1 __attribute__((packed));
uint16_t p2 __attribute__((packed));
uint8_t p3;
};
考虑这个 class:
class C3
{
public:
uint16_t p1;
uint16_t p2;
uint8_t p3;
};
sizeof(C3)
是 6
。是否有任何编译器例程可以绕过对齐并强制其大小为 5
?我尝试使用 alignas
但没有成功...
使用 MSVC
编译器(您已包含 VS-2015 标记),您可以使用 #pragma pack
指令为 类 和结构设置填充选项。这也允许您 save/restore 'default' 设置,使用 push
和 pop
选项。
以下简短示例演示了这一点:
#include <iostream>
class C3 {
public:
uint16_t p1;
uint16_t p2;
uint8_t p3;
};
#pragma pack(push, 1) // Save current packing and set to single-byte
class C4 {
public:
uint16_t p1;
uint16_t p2;
uint8_t p3;
};
#pragma pack(pop) // Restore saved packing
class C5 {
public:
uint16_t p1;
uint16_t p2;
uint8_t p3;
};
int main()
{
std::cout << sizeof(C3) << std::endl; // 6
std::cout << sizeof(C4) << std::endl; // 5
std::cout << sizeof(C5) << std::endl; // 6 (again)
return 0;
}
许多其他编译器支持指令等同于 MSVC #pragma pack
。
类似于 Adrian 的回答,您也可以为某些可能不支持 #pragma pack
:
class C3
{
public:
uint16_t p1 __attribute__((packed));
uint16_t p2 __attribute__((packed));
uint8_t p3;
};