Dej*_*jwi 1 c++ stl memory-alignment
当我宣布这样的结构时:
#pragma pack(1)
structure MyStruct{
uint32_t first;
uint8_t second;
};
#pragma pack()
Run Code Online (Sandbox Code Playgroud)
我显然希望它占用5个字节的内存.那么这样的矢量将如何表现:
std::vector<MyStruct> MyVec;
Run Code Online (Sandbox Code Playgroud)
或者这样的地图:
std::map<MyStruct> MyMap;
Run Code Online (Sandbox Code Playgroud)
他们会遵守要求的协调吗?我可以强制STL结构吗?
条件是某些编译器可以#pragma完全忽略,是的,#pragma 影响类型的定义,因此将该类型存储在向量中(例如)意味着将存储的内容将被打包.
#include <iostream>
#include <vector>
typedef unsigned long uint32_t;
typedef unsigned char uint8_t;
struct MyStruct0{
uint32_t first;
uint8_t second;
};
#pragma pack(1)
struct MyStruct{
uint32_t first;
uint8_t second;
};
#pragma pack()
int main(){
std::vector<MyStruct0> a;
std::vector<MyStruct> b;
std::cout << "Unpacked size: " << sizeof(a[0]) << "\n";
std::cout << "Packed size: " << sizeof(b[0]) << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:
Unpacked size: 8
Packed size: 5
Run Code Online (Sandbox Code Playgroud)
std::vector 需要与相同类型的普通 C=style 数组布局兼容。所以它别无选择,只能将它们放置在您为结构管理的大小上。
对于其他基于节点的集合,取决于节点是如何创建的,那里出现了哪些额外的字节。
| 归档时间: |
|
| 查看次数: |
1052 次 |
| 最近记录: |