一、#Pragma
1.1 #Pragma once用于指示编译器头文件只编译一次
举例:
#pragma once
#include <list>
#include <mutex>
...
...
...
1.2 #Pragma pack(n) 用于指定结构体、联合体或类实例在内存中的字节对齐方式
n 表示指定对齐字节数,如果()内为空的话,则表示恢复默认对齐方式。使用时将需要对齐的结构体、联合体、类使用一对 #Pragma pack(n) 包起来。
举例:
#include <iostream>
// 设置内存对齐为1字节
#pragma pack(1)
// 枚举类型
typedef enum {
__VALUE1 = 1,
__VALUE2 = 2,
__VALUE3 = 3,
__VALUE4 = 4,
__VALUE5 = 5,
__VALUE6 = 6,
__VALUE7 = 7,
__VALUE8 = 8,
__VALUE9 = 9 ///< 总是4个字节
}E_TestEnum; ///< #pragma pack(1)对枚举无效。因为枚举类型在内存中并不占用独立的空间,它只是为一组常量定义了符号名称
// 结构体
struct MyStructEnmu {
char a; // 1字节
int b; // 4字节
E_TestEnum c; // 4字节
short d; // 2字节
};
// 结构体
struct MyStruct {
char a; // 1字节
int b; // 4字节
short c; // 2字节
};
// 联合体
union MyUnion {
int intValue; // 4字节
float floatValue; // 4字节
char charValue; // 1字节
};
// 类
class MyClass {
private:
char x; // 1字节
double y; // 8字节
public:
int z; // 4字节
};
// 恢复默认的内存对齐设置
#pragma pack()
int main() {
std::cout << "Size of MyEnum: " << sizeof(E_TestEnum) << " bytes\n"; // 4字节
std::cout << "Size of MyStructEnmu : " << sizeof(MyStructEnmu) << " bytes\n"; // 11字节
std::cout << "Size of MyStruct: " << sizeof(MyStruct) << " bytes\n"; // 7字节 (1 + 4 + 2)
std::cout << "Size of MyUnion: " << sizeof(MyUnion) << " bytes\n"; // 4字节(联合体在内存中的大小等于它最大成员的大小)
std::cout << "Size of MyClass: " << sizeof(MyClass) << " bytes\n"; // 13字节 (1 + 8 + 4)
system("pause");
return 0;
}
运行结果


1544

被折叠的 条评论
为什么被折叠?



