std :: tuple内存对齐

Nts*_*alt 13 c++ tuples memory-alignment language-lawyer c++11

是否有关于元组伪成员的布局和内存对齐的正式规范?

反正有没有修改元组中类型的内存对齐?它是否受#pragma pack()指令的影响?

例如:

typedef std::tuple<uint8_t, uint32_t> myTuple;
Run Code Online (Sandbox Code Playgroud)

是否有任何规范说这将在内存中与以下相同:

#pragma pack() // Default packing
struct myStruct
{
    uint8_t first;
    uint32_t second;
}
Run Code Online (Sandbox Code Playgroud)

抱歉,如果这是一个愚蠢的问题,但我不完全理解模板的对齐.

编辑:我正在努力完成的例子

目前我有一些东西......

#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);
Run Code Online (Sandbox Code Playgroud)

如果我想为元编程目的使用typedef cTriangle,std::tuple<uint32, uint32, uint32>我仍然可以读取/写入元组的原始内存(因此是元组的向量),或者该内存是否具有未知对齐?

eca*_*mur 13

元组通常不是标准布局,因为标准布局类在其继承层次结构中最多只能有一个具有非静态数据成员的类,实现可变参数的典型方法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))
Run Code Online (Sandbox Code Playgroud)


Dav*_*rtz 11

不仅没有要求以任何特定方式排列对象,而且许多tuple实现实际上将第二个对象放在第一个对象之前.

  • 我以为我回答了 这三个问题的答案都是"不".布局未指定,许多实际实现使用的布局甚至都不是您想要的. (5认同)