Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结构/类数据对齐和填充的算法? 我似乎找不到任何关于如何在C、C++中的结构或类中计算填充的信息。_C++_C_Hlsl - Fatal编程技术网

结构/类数据对齐和填充的算法? 我似乎找不到任何关于如何在C、C++中的结构或类中计算填充的信息。

结构/类数据对齐和填充的算法? 我似乎找不到任何关于如何在C、C++中的结构或类中计算填充的信息。,c++,c,hlsl,C++,C,Hlsl,在HLSL中有称为“常量变量”的数据结构,它们非常类似于启用了#pragma pack(4)的C结构。有关HLSL中常量变量的更多信息 我遇到的问题是试图创建结构格式描述符。解析HLSL代码后,常量描述符将包含有关常量变量结构中包含的数据类型的信息。它将描述每个成员变量的数据类型、偏移量和结构的总大小。我遇到的麻烦是,由于填充,无法确定结构的最终大小 如果有这样的算法,那么我应该能够对其进行编码,并计算HLSL中任何“常量变量”的实际填充大小。问题是我不知道它是什么,也不知道在哪里可以找到它 我

在HLSL中有称为“常量变量”的数据结构,它们非常类似于启用了
#pragma pack(4)
的C结构。有关HLSL中常量变量的更多信息

我遇到的问题是试图创建结构格式描述符。解析HLSL代码后,常量描述符将包含有关常量变量结构中包含的数据类型的信息。它将描述每个成员变量的数据类型、偏移量和结构的总大小。我遇到的麻烦是,由于填充,无法确定结构的最终大小

如果有这样的算法,那么我应该能够对其进行编码,并计算HLSL中任何“常量变量”的实际填充大小。问题是我不知道它是什么,也不知道在哪里可以找到它

我的问题是询问用于使#pragma pack 4工作的算法。(例如,它是否一次查看一个结构中的一个变量,并使用某种最大大小测试来确定填充位置,或者它是否分析整个结构并以某种方式洗牌数据。)

编译器不能在C样式的结构中乱序数据。C保证成员完全按照声明的顺序分配。任何填充必须位于成员之间或结构的末尾


具有访问指定符的C++类不一定与C兼容,所以允许重新排序。

不清楚你想做什么。您说您想知道“实际填充大小”,那么
sizeof
有什么问题吗?您是想在运行时还是编译时这样做?或者您正在尝试制作一个处理HLSL并生成具有适当填充HLSL常量的C/C++对象的工具?为什么不使用编译器来帮助您解决这个问题呢?使用sizeof关键字、offsetof()宏和编译器支持的任何#pragma来更改打包#pragma pack受MSVC支持。这是一个运行时操作,其目的是确定如何在CPU内存和GPU的常量寄存器之间映射数据。这些内部填充取决于编译器/平台,通常没有外部记录,至少在某些情况下没有。如果您真的需要这些填充,最好的办法是为这些结构生成C代码,并生成打印其内部布局的代码,编译该代码并解析输出。