std::string 和数据对齐
std::string and data alignment
我打算使用 std::string
作为通用数据缓冲区(而不是自己滚动)。我需要将各种 POD 打包到其中,包括用户定义的结构,由 std::string
分配的内存缓冲区是否为此目的正确对齐?
如果在C++标准中没有规定,libstdc++中是什么情况?
主持人CPU是x86_64。
首先,如果您想存储任意数据,std::string
可能不是最好的容器。我建议改用 std::vector
。
其次,容器所做的所有分配的对齐由其分配器控制(第二个模板参数,默认为std::allocator<T>
)。默认分配器将根据最大标准类型的大小对齐分配,在我的机器上通常是 long long
或 long double
,分别是 8 字节和 16 字节,但是这些类型的大小不是由标准。
如果你想要一个特定的对齐,你应该检查你的编译器对齐的内容,或者通过提供你自己的分配器或使用 std::aligned_storage
.
来明确要求对齐
我打算使用 std::string
作为通用数据缓冲区(而不是自己滚动)。我需要将各种 POD 打包到其中,包括用户定义的结构,由 std::string
分配的内存缓冲区是否为此目的正确对齐?
如果在C++标准中没有规定,libstdc++中是什么情况?
主持人CPU是x86_64。
首先,如果您想存储任意数据,std::string
可能不是最好的容器。我建议改用 std::vector
。
其次,容器所做的所有分配的对齐由其分配器控制(第二个模板参数,默认为std::allocator<T>
)。默认分配器将根据最大标准类型的大小对齐分配,在我的机器上通常是 long long
或 long double
,分别是 8 字节和 16 字节,但是这些类型的大小不是由标准。
如果你想要一个特定的对齐,你应该检查你的编译器对齐的内容,或者通过提供你自己的分配器或使用 std::aligned_storage
.