Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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_Struct_Memory Layout - Fatal编程技术网

C++ 是否存在不关心结构/类布局的术语?若否,原因为何?

C++ 是否存在不关心结构/类布局的术语?若否,原因为何?,c++,c,struct,memory-layout,C++,C,Struct,Memory Layout,有各种各样的pragmas用于控制结构/类布局,例如pragma-pack。但据我所知,没有什么布拉格语可以说“我不在乎布局。它是内部的,代码不依赖它。重新排序以获得最佳性能/大小。”。好吧,这是典型的情况,在许多情况下,它可以提高性能/大小。此外,即使程序员非常小心地根据性能/大小对其重新排序,不同的目标体系结构也可能有不同的最佳布局 编辑:为了澄清,我在谈论成员的顺序。填充已经是可控的 此外,PVS Studio还有一个相关的功能。这就是我要说的-为什么不能用带有pragma的编译器来实现这

有各种各样的
pragma
s用于控制结构/类布局,例如
pragma-pack
。但据我所知,没有什么布拉格语可以说“我不在乎布局。它是内部的,代码不依赖它。重新排序以获得最佳性能/大小。”。好吧,这是典型的情况,在许多情况下,它可以提高性能/大小。此外,即使程序员非常小心地根据性能/大小对其重新排序,不同的目标体系结构也可能有不同的最佳布局

编辑:为了澄清,我在谈论成员的顺序。填充已经是可控的


此外,PVS Studio还有一个相关的功能。这就是我要说的-为什么不能用带有
pragma的编译器来实现这一点呢?

这种语言特别指出,类成员在内存中的排序方式与在每个访问级别中的排序方式相同(如
private
)。pragma无法覆盖此行为

见9.2/14:

具有相同访问权限的(非联合)类的非静态数据成员 控制权(第11条)的分配是为了使后来的成员拥有更高的控制权 类对象中的地址。非静态资源的分配顺序 未指定具有不同访问控制的数据成员


请记住,对成员重新排序会改变调用子对象构造函数和析构函数的顺序,可能还会改变其他事情。即使给编译器一个pragma,在幕后进行这些更改似乎也是非常危险的(如果您有一个成员依赖于另一个成员的初始化该怎么办)。

该语言特别指出,类成员在内存中的排序方式与在每个访问级别中的排序方式相同(如
private
). pragma无法覆盖此行为

见9.2/14:

具有相同访问权限的(非联合)类的非静态数据成员 控制权(第11条)的分配是为了使后来的成员拥有更高的控制权 类对象中的地址。非静态资源的分配顺序 未指定具有不同访问控制的数据成员


请记住,对成员重新排序会改变调用子对象构造函数和析构函数的顺序,可能还会改变其他事情。即使给编译器一个pragma,在幕后进行这些更改似乎也是非常危险的(如果您有一个成员依赖于另一个成员的初始化该怎么办)。

该语言特别指出,类成员在内存中的排序方式与在每个访问级别中的排序方式相同(如
private
). pragma无法覆盖此行为

见9.2/14:

具有相同访问权限的(非联合)类的非静态数据成员 控制权(第11条)的分配是为了使后来的成员拥有更高的控制权 类对象中的地址。非静态资源的分配顺序 未指定具有不同访问控制的数据成员


请记住,对成员重新排序会改变调用子对象构造函数和析构函数的顺序,可能还会改变其他事情。即使给编译器一个pragma,在幕后进行这些更改似乎也是非常危险的(如果您有一个成员依赖于另一个成员的初始化该怎么办)。

该语言特别指出,类成员在内存中的排序方式与在每个访问级别中的排序方式相同(如
private
). pragma无法覆盖此行为

见9.2/14:

具有相同访问权限的(非联合)类的非静态数据成员 控制权(第11条)的分配是为了使后来的成员拥有更高的控制权 类对象中的地址。非静态资源的分配顺序 未指定具有不同访问控制的数据成员


请记住,对成员重新排序会改变调用子对象构造函数和析构函数的顺序,可能还会改变其他事情。即使给编译器一个pragma,在幕后进行这些更改似乎也是非常危险的(如果您有一个成员依赖于另一个成员的初始化,该怎么办)。

语言标准允许这样的pragma,但我不知道有哪一个编译器实现这样的事情

在C中,
#pragma
的行为在的第6.10.6节中有规定(链接到最新草案):

格式为
#pragmapp tokensopt新行
其中预处理令牌
STDC
不会立即 遵循指令中的pragma(在任何宏替换之前) 使实现在定义的实现中运行 态度。该行为可能会导致翻译失败或导致 翻译器或由此产生的程序以不一致的方式运行 态度。实现未识别的任何此类杂注 被忽略了

因此,
#pragma
实际上可能违反语言规则

本例中的相关规则是结构成员按声明顺序排列。6.7.2.1第15段:

结构对象中的非位字段成员和单位 哪些位字段的地址按顺序递增 它们是被宣布的。指向结构对象的指针 已转换,指向其初始成员(或如果该成员是 位字段,然后发送到它所在的单元),反之亦然。 结构对象中可能有未命名的填充,但其位置不存在 开始

坏消息是:C标准要求按声明的顺序排列结构成员。第一个成员必须位于偏移量0处。可能会出现任意的paddin