【问题标题】:Array of class holding an array memory layout持有数组内存布局的类数组
【发布时间】:2021-08-28 06:14:26
【问题描述】:

如果我们有一个包含数组的类,我们称它为向量并将值保存在一个名为 data 的简单数组中:

class vector
{
public:
   double data[3];
   <...etc..>
};

注意:称为vector是为了解释清楚,不是std::vector!!!

所以我的问题是,如果我只在类内的这个数组附近存储 typedefs 和一些 constrexpr,如果类在内存中只有 3 个双精度数,我是否正确? 然后,如果我创建一个向量数组,例如:

vector vl[3];

注意:数组的大小在编译时并不总是已知的,示例中不要使用 3。

那么在记忆中它只会是9个双打,对吧? 所以 vl[0].data[3] 总是会返回第二个向量的第一个元素?而在这种情况下,是否保证结果总是像内存中的一个简单数组?

我发现只有数组数组的情况,但没有包含数组的类数组,我不确定最后是否完全相同。我做了一些测试,似乎它像我预期的那样工作,但我不知道它是否总是正确的.. 谢谢!

【问题讨论】:

    标签: c++ arrays class


    【解决方案1】:

    你的第一个例子是对的:类布局就像一个 C 结构。第一个成员驻留在结构本身的地址,如果是数组,则数组的所有成员都是相邻的。

    但是,

    Between 结构成员可能是填充;所以不能保证结构的大小是所有成员大小的总和。我必须深入研究标准,但我认为这包括最后的填充。 This answer 确认; assert(sizeof(vector) == 3*sizeof(double)) 可能不成立。实际上,我假设一个实现可以填充一个包含三个 chars 的结构,以便该结构在数组中的字边界处对齐,但不是三个双精度数,这通常是具有最强对齐要求的类型。但是实现、架构和编译器选项之间并不能保证:假设我们切换到 128 位 CPU。

    关于您的第二个示例:上述内容递归适用,因此标准不保证 9 个双打是相邻的。另一方面,我敢打赌它们会是,并且程序可以使用一个简单的编译时 static_assert 来断言它。

    【讨论】:

    • vector 问题不是std::vector,它是一个数学 3 向量
    • 是的,对不起,我称它为矢量是为了更容易理解。
    • @Caleth 哦,对不起,我完全错过了班级名称;-)。
    【解决方案2】:

    大多数情况下,是的。

    标准不保证data 之后在vector 的表示中永远不会有任何内容,但我所知道的所有实现都不会添加任何填充在这种情况下.

    承诺的是vector的表示中data之前没有填充,因为它是StandardLayout类型。

    【讨论】:

    • 谢谢,所以如果我需要一个向量数组和元素操作,如果我创建一个不同的类来分配一大块内存(即用于 3 个向量,一个由 9 个元素组成的数组),然后循环遍历那个?因为在这种情况下,所有内容都在一个大的连续内存块中,肯定没有任何额外的填充?
    • @simre 它可能是相同的。拥有 一个 数据成员(数组是一回事)并且我所知道的所有编译器都没有布置任何 virtual 没有填充。
    • @simre 正如我在回答中所说:您可以简单地 static_assert 结果结构大小;如果它是所有成员大小的总和,则没有填充。一般来说,我会尝试使用自然数据表示。如果您有三个向量,请使用三个 vectors 而不是 9 个不相关的数字。
    • @Peter-ReinstateMonica,是的,但只有在您知道编译时的大小时才会这样做。抱歉,我应该澄清一下,数组的大小在编译时并不总是已知的。但是我在您的答案中的链接中看到,编译器可以“强制”创建一个打包结构,所以我是否正确,如果我使用 int、uint、float 或 double 作为向量数据类型,那么编译器将不会t 添加填充只是将它们一个接一个地放置?我正在使用 GCC,所以我可以根据链接的答案轻松地强制它。我尽量避免填充,因为我的数组可能已经非常大了......
    • @simre 在 C++ 中,您不能拥有大小未知的数据成员。如果您想要运行时大小,请使用 std::vector
    猜你喜欢
    • 2010-10-03
    • 2023-04-09
    • 1970-01-01
    • 2015-06-30
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多