gpt4 book ai didi

c++ - float 结构是否有任何填充?

转载 作者:行者123 更新时间:2023-11-28 04:25:40 25 4
gpt4 key购买 nike

我需要创建一个充满 float 的内存块。但是我不想制作一个浮点 vector ,我想制作一个 vector ,其中每个成员都是一组相关的 float :

struct FloatStruct
{
FloatStruct() :
a(1.f), b(10.f), c(100.f), d(1000.f), e(10000.f) { }

float a;
float b;
float c;
float d;
float e;
};


int main()
{
std::vector<FloatStruct> fvec(100);

auto pf = &fvec[0].a;

for(int i = 0; i < 500; ++i)
std::cout << *pf++ << "\n";
}

上面的代码显然在我使用 MSVC 的架构上运行良好(在一些使用 GCC 或 Clang 的在线编译器上也运行良好)。花车都挤得严严实实。但我担心该代码的可移植性。也许可以在某些架构上添加填充,从而打破内存的紧密性。

标准是否对这种情况作出任何保证?

最佳答案

要回答您的问题,是的,有些平台可能会造成麻烦。由于您特别提到它要发送到 GPU,因此对于某些架构可能会有问题。我最近在 macOS 上使用 Metal 时遇到了这个问题,我想将数据减少 25%,因此只发送 (x, y, z) 而不是 (x, y, z, 1.0) 作为我的纹理坐标,结果是坐标都关闭了。 (我认为问题在于 GPU 架构采用了 CPU 架构未提供的特定填充,但我认为如果情况相反,它会给出类似的糟糕结果。)

跨平台兼容性的解决方案可能是定义一个宏,以确保为您使用的每个编译器提供正确的填充。然后在定义数据结构时,使用该宏来获得正确的填充。所以它看起来像这样:

#if MSVC
#define PACK_TIGHTLY <MSVC-specific definition of tight packing>
#define END_PACK_TIGHTLY <MSVC-specific definition of ending tight packing>
#elif Clang
#define PACK_TIGHTLY <clang-specific definition of tight packing>
#define END_PACK_TIGHTLY <clang-specific definition of ending tight packing>
#elif
// ... etc. for other platforms you want to support
#endif

然后在定义您的 struct 时,您需要执行以下操作:

PACK_TIGHTLY
struct FloatStruct
{
FloatStruct() :
a(1.f), b(10.f), c(100.f), d(1000.f), e(10000.f) { }

float a;
float b;
float c;
float d;
float e;
};
END_PACK_TIGHTLY

关于c++ - float 结构是否有任何填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54379656/

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