pragma打包一个stl容器

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结构吗?

Jer*_*fin 5

条件是某些编译器可以#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)


Bal*_*Pal 5

std::vector 需要与相同类型的普通 C=style 数组布局兼容。所以它别无选择,只能将它们放置在您为结构管理的大小上。

对于其他基于节点的集合,取决于节点是如何创建的,那里出现了哪些额外的字节。