标准::元组内存对齐
std::tuple memory alignment
元组伪成员的布局和内存对齐是否有任何正式规范?
有没有办法修改元组中类型的内存对齐方式?它是否受 #pragma pack() 指令的影响?
例如:
typedef std::tuple<uint8_t, uint32_t> myTuple;
是否有任何规范说这将在内存中与以下内容相同:
#pragma pack() // Default packing
struct myStruct
{
uint8_t first;
uint32_t second;
}
抱歉,如果这是一个愚蠢的问题,但我并不完全理解模板的对齐方式。
编辑:我试图完成的示例
目前我有一些类似的东西...
#pragma pack(push)
#pragma pack(4)
struct cTriangle
{
uint32 Index[3];
};
#pragma pack(pop)
template <class T>
inline bool Read(cFileStream& fStream, std::vector<T>& vec)
{
if (!vec.size())
return true;
// fStream.Read(void* pBuffer, size_t Size)
// Just a wrapper around a binary ifstream really
return fStream.Read(&vec[0], sizeof(T) * vec.size());
}
std::vector<cVector3> vPoint;
vPoint.resize(Verticies);
bool result = Read(FileStream, vPoint);
如果我想将 typedef cTriangle
作为元编程目的的std::tuple<uint32, uint32, uint32>
,我是否仍然能够读取/写入元组的原始内存(以及元组的向量),或者该内存是否有未知的对齐方式?
不仅没有要求对象以任何特定方式排列,而且许多tuple
实现实际上将第二个对象放在第一个对象之前。
组通常不是标准布局,因为标准布局类在其继承层次结构中最多可以有一个具有非静态数据成员的类,并且实现可变参数tuple
的典型方法是通过递归继承,每个递归级别添加一个数据成员。 这允许tuple
实现通过空基类优化来省略不同的空成员,而空基类优化不适用于struct
成员。
如果您检查该sizeof(myTuple) == sizeof(myStruct)
,则您有合理的权利假设元组的内存布局以某种(一致)顺序包含结构的元素,但实际上依靠它进行混叠可能会导致未定义的行为。
如果你说你只需要带有tuple
的别名用于元编程,你最好使用元编程库,如 Boost.Fusion,它允许你用它的成员注释结构类型:
#pragma pack(push)
#pragma pack(4)
struct cTriangle {
uint32 Index[3];
};
#pragma pack(pop)
BOOST_FUSION_ADAPT_STRUCT(
cTriangle,
(uint32[3], Index))
正如大卫指出的那样,根据标准没有保证。但是,如果您对双值元组感兴趣,则可能需要使用 std::pair<T1, T2>
,它是标准布局(如果T1,T2
是标准布局),因此具有可预测的内存布局。
另请参阅C++0x 元组向后存储元素
[编辑]
抱歉,在回答您的评论之前,我没有看到 ecatmur 的答案。顺便说一下:如果你结构的所有成员都有相同的类型,你当然可以使用std::array,这是标准布局,它允许使用std::get访问元素,类似于std::tuple。
- 使 std::vector 分配对齐内存的现代方法
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- Linux C++ 中的页面对齐内存分配
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 如何使用此宏测试是否对齐内存
- g++ 如何对齐内存以确保对齐从缓存行的开头开始?
- 正确对齐内存模板,参数顺序不变
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 读取 /编写部分分配的对齐内存
- 指向对齐内存的指针
- 在C++11中,推荐的对齐内存的方法是什么
- C++-对齐内存
- m = XMMatrixIdentity() - 类中的对齐内存后崩溃
- 新字符是否实际上保证类类型的对齐内存
- 分配32字节对齐内存的分配器
- 如何从操作符new或mremap的malloc中获取页对齐内存
- 新 char[] 产生对齐内存的标准要求C++背后的意图是什么?
- 未对齐内存访问:它是定义的行为或不
- 在c++中声明、操作和访问未对齐内存
- c++ 11中的动态对齐内存分配