gpt4 book ai didi

c++ - C++中的结构对齐

转载 作者:搜寻专家 更新时间:2023-10-31 00:47:57 24 4
gpt4 key购买 nike

struct Vector 
{
float x, y, z;
};

func(Vector *vectors) {...}

usage:
load float *coords = load(file);
func(coords);

我有一个关于 C++ 中结构对齐的问题。我会将一组点传递给函数 func()。可以按照上面显示的方式进行操作,还是依赖于平台相关行为? (它至少适用于我当前的编译器)有人可以推荐一篇关于该主题的好文章吗?

或者,在从文件加载数据的同时直接创建一组点是否更好?

谢谢

最佳答案

结构对齐依赖于实现。但是,大多数编译器都为您提供了一种方法来指定结构应该被“打包”(即,在内存中排列,字段之间没有填充字节)。例如:

struct Vector {
float x;
float y;
float z;
} __attribute__((__packed__));

以上代码将导致 gcc 编译器将结构打包到内存中,从而更容易转储到文件并在以后读回。执行此操作的确切方法可能因您的编译器而异(详细信息应在您的编译器手册中)。

我总是在不同的行中列出压缩结构的成员,以便清楚它们出现的顺序。对于大多数编译器,这应该等同于 float x, y, z; 但我不确定这是否是依赖于实现的行为。为了安全起见,我会每行使用一个声明。

如果您正在从文件中读取数据,则需要在将数据传递给 func 之前验证数据。再多的数据对齐实现也无法弥补输入验证的不足。

编辑:

进一步阅读您的代码后,我更了解您要做什么。您有一个包含三个 float 值的结构,并且您正在使用 float* 访问它,就好像它是一个 float 数组一样。这是非常糟糕的做法。您不知道编译器可能在结构的开头或结尾使用了哪种填充。即使使用压缩结构,将结构视为数组也是不安全的。如果数组是您想要的,则使用数组。最安全的方法是从文件中读取数据,将其存储到类型为 struct Vector 的新对象中,然后将其传递给 func。如果 func 被定义为采用 struct Vector* 作为参数,并且您的编译器允许您传递 float* 而无需提示,那么这确实是您不应依赖的依赖于实现的行为。

关于c++ - C++中的结构对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3196983/

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