gpt4 book ai didi

c++ - 在这种情况下我可以依赖连续内存吗?

转载 作者:太空狗 更新时间:2023-10-29 21:24:34 24 4
gpt4 key购买 nike

考虑一个类:

template <typename T>
struct A{
//...many public member functions...
T x;
T y;
T z;
}

还有一个类似的:

template <typename T>
struct B{
//many public member functions
T x;
T y;
}

虽然此处未指定,T 将始终为 floatintbool

现在考虑另一个结构:

struct Pair{
A<float> a;
B<float> b;
}

现在是一个 vector :

 std::vector<Pair> bigBunch;

假设 bigBunch 中的所有 xyz 都是连续的有多安全?我知道 vector 保证其 Pair 之间的连续内存,但我也知道 struct 不一定保证连续内存,因为可能会发生填充。但是,我认为只有当您的 struct 元素是不同类型时,填充才会带来风险。

我希望能够获得指向 bigBunch[0].a.x 的指针,然后知道我可以在整个过程中得到一个连续的 floatbigBunch 的全部内容。实际上,指向 bigBunch[0].a.x 的指针将指向与刚才说的相同的位置 `bigBunch[0].a

Pair.aPair.b 是相同类型还是不同类型,比如混合 intfloat 而不是两者都是同一类型(在此示例中为 float)?

最佳答案

据我所知,标准中没有任何内容可以阻止编译器在认为这是个好主意的情况下添加填充。编译器在这件事上确实有很大的回旋余地。这意味着最好的做法是采取防御措施并明确指示您的编译器打包数据,即使例如 4 字节边界上的 4 字节 float 不应该导致填充。

我的另一个建议是使用 static_assert验证一切都是你想要的尺寸。例如,

template <typename T>
struct A{
//...many public member functions...
T x;
T y;
T z;
} __attribute__ ((__packed__));
static_assert(sizeof(A) == 3*sizeof(T), "struct A shouldn't be padded");

如果你没有 C++ 11,你可以使用 BOOST_STATIC_ASSERT 反而。编辑:__attribute__ ((__packed__))结构的右大括号之后的位是 GCC 特定的确保结构紧密打包的方法。

您应该考虑的另一件事是,您是否真的能从能够治疗您的 vector<Pair> 中获益?作为一个大float阵列没有间隙。我知道,如果您必须遍历所有内容,或者如果您必须将数据传递给其他一些需要连续数据的库,那么编写某些算法可能会更方便。但我猜你正在用这些结构做很多数学运算,你的编译器可能能够自动向量化其中的一些,例如通过使用 SSE if struct A是 128 位对齐的。我在这部分的回答中有很多猜测,所以如果它不适用于您,请忽略它。

PS:不要忘记结构右括号后的分号。

关于c++ - 在这种情况下我可以依赖连续内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15802221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com