gpt4 book ai didi

c++ - 堆上的 double 总是 8 字节对齐的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 11:30:18 24 4
gpt4 key购买 nike

通过阅读其他各种 Stack Overflow 问题,似乎 double 值有时可能只是 4 字节对齐而不是 8(因此存在 GCC 的 -malign-double).这是否适用于堆和堆栈?

在我看来,如果堆上的 double 值并不总是 8 字节对齐,那么就不可能用 double* 值执行指针运算,因为递增 double* 会使它前进 8 个字节,但是两个任意 double* 值之间的差异可能不是 8 个字节的倍数。

如果您对我感兴趣的用例感到好奇,我有类似的东西:

#include <iostream>

#include <iostream>
#include <vector>

struct EmptyBase1
{
};

struct EmptyBase2
{
};

struct Point : public EmptyBase1, public EmptyBase2
{
double x;
double y;
double z;
};

int main() {
std::vector<Point> points(10);
int stride = &points[1].x - &points[0].x;
std::cout << stride << std::endl;
return 0;
}

在这种情况下,Visual Studio 没有完全应用空基类优化(参见 https://stackoverflow.com/a/12714226/953078 ),因此不能保证 sizeof(Point) == 3 * sizeof(double)stride 是否保证始终在 &points[1].x&points[2].x 之间提供有效的内存偏移量,&points [5].y&points[4].y 等?

最佳答案

从3.7.3.1我们学习分配函数返回的指针应该适当对齐,以便它可以转换为任何完整对象类型的指针,然后用于访问分配的存储中的对象或数组。这就是说它必须与硬件适当对齐。因此,您可以设想没有对齐约束的硬件,并且 double 可以从 new 中按字节对齐。

你的减法是不合法的,因为这两个 double 不是同一数组/连续 double block 的一部分。但是,reinterpret_cast 将地址char* 然后减去那些 指针应该是完全合法的。但是您要解决的实际问题是什么?

编辑:正如评论中指出的那样,我现在实际上相当确定即使转换为 char* 并进行减法也是非法的。

关于c++ - 堆上的 double 总是 8 字节对齐的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25022203/

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