互操作:C#和非托管C+的结构打包对齐默认值是否相同+;在给定的平台上?

互操作:C#和非托管C+的结构打包对齐默认值是否相同+;在给定的平台上?,c#,.net,visual-c++,uwp,C#,.net,Visual C++,Uwp,或者我是否需要在每种类型中明确指定对齐方式以确保匹配?C#和非托管C代码都构建在同一系统上(VS IDE或MSBuild)。和的默认打包大小 C文章说默认打包由/Zp[n]编译器开关选项控制,默认情况下该选项设置为8 C#文章说,Pack字段控制内存中类型字段的对齐方式。默认情况下,该值为0,表示“当前平台”的默认打包大小,不管这意味着什么(请阅读本文;那里的故事比C/C++版本要复杂一些)。为什么您不总是希望显式?这样做可以消除所有疑问。因为我们假设默认值将是编译器设计人员根据一般情况确定的最

或者我是否需要在每种类型中明确指定对齐方式以确保匹配?C#和非托管C代码都构建在同一系统上(VS IDE或MSBuild)。

和的默认打包大小

C文章说默认打包由
/Zp[n]
编译器开关选项控制,默认情况下该选项设置为8


C#文章说,Pack字段控制内存中类型字段的对齐方式。默认情况下,该值为0,表示“当前平台”的默认打包大小,不管这意味着什么(请阅读本文;那里的故事比C/C++版本要复杂一些)。

为什么您不总是希望显式?这样做可以消除所有疑问。因为我们假设默认值将是编译器设计人员根据一般情况确定的最佳值,他们的判断可能比我的好。我建议明确地告诉编译器您想要什么类型的
struct
布局和打包。这样你就可以确保结果是预期的。实现可能不同于其他体系结构(甚至操作系统),UWP应用程序中的互操作被CLR中内置的语言投影小心地掩盖了。在C++方面,它是用C++ +CX扩展或C++ +WRT库完成的。在后台,您正在使用COM来获取代码块,以便相互通信。这一切都是看不见的,我不知道有哪种情况是对齐造成了麻烦。所以继续前进,没什么好担心的。@Hans这听起来更像是P/Invoke。但我不知道在C#文章中哪里说默认值是8。它只是碰巧给出了一个例子,其中8的结果与默认值相同(属性设置为0)。@Stacklysm这只是针对C/C++的。这只是说结构-大小-是8字节,而不是与8字节对齐。