C++ 定义满成员的结构时,是否为此结构类型的每个变量创建了这些成员?

C++ 定义满成员的结构时,是否为此结构类型的每个变量创建了这些成员?,c++,c,struct,C++,C,Struct,所以这里有一个代码: struct ACDC { double in, out, A, B, C; }; struct VALUE { struct ACDC I, V; }; struct VALUE motor1, motor2, DC; 当我声明这个结构的一些变量时,比如motor1、motor2、DC1、DC2,我不需要为所有变量使用所有成员。我只需要像这样的东西: motor1.I.A; motor1.I.B; motor1.I.C; motor2.I.A; motor2

所以这里有一个代码:

struct ACDC
{
  double in, out, A, B, C;
};

struct VALUE
{
  struct ACDC I, V;
};

struct VALUE motor1, motor2, DC;
当我声明这个结构的一些变量时,比如motor1、motor2、DC1、DC2,我不需要为所有变量使用所有成员。我只需要像这样的东西:

motor1.I.A; motor1.I.B; motor1.I.C;
motor2.I.A; motor2.I.B; motor2.V.A; motor2.V.B;
DC.I.in;
DC.I.out;
所以问题是,当我创建变量时,是否为变量声明了其他成员并占用了内存中的空间?如果是这样,如何做到只有在第一次调用时才创建它们


谢谢

正确答案是视情况而定

如果您使用来自编译器的高级优化(例如-O2),那么除非在某些地方使用这些变量,否则编译器将取消这些变量。否则将为它们分配内存


关于单个
struct
成员,是的,该结构将作为一个整体分配,而不是按成员分配(为了更好地理解,请检查填充)

正确答案是视情况而定

如果您使用来自编译器的高级优化(例如-O2),那么除非在某些地方使用这些变量,否则编译器将取消这些变量。否则将为它们分配内存


关于单个
struct
成员,是的,该结构将作为一个整体分配,而不是按成员分配(为了更好地理解,请检查填充)

结构描述内存布局。当您实例化一个时,它会为整个事情分配内存,而成员名本质上是该分配中偏移量的助记符,这要求在编译时知道它们

如果您需要可选元素,则必须使用指针或可能的一些复杂模板SangaNigon来指向C++中的指针。p> 因为您指定了两种非常不同的语言(C与C++),所以我不能给出一个具体的、惯用的示例

然而,您给出的示例看起来只是糟糕/草率的设计,而不是对可变可选成员资格的真正需求


您可能希望将要解决的问题显示为新问题。

结构描述内存布局。当您实例化一个时,它会为整个事情分配内存,而成员名本质上是该分配中偏移量的助记符,这要求在编译时知道它们

如果您需要可选元素,则必须使用指针或可能的一些复杂模板SangaNigon来指向C++中的指针。p> 因为您指定了两种非常不同的语言(C与C++),所以我不能给出一个具体的、惯用的示例

然而,您给出的示例看起来只是糟糕/草率的设计,而不是对可变可选成员资格的真正需求


您可能希望将您试图解决的问题显示为一个新问题。

当然,如果您创建的变量类型为
VALUE
,则无论您是否“需要”嵌套结构,都会为其分配内存及其所有内容。(OTOH,请参阅@Kiloreux关于优化编译器的回答,这些编译器可能会执行非常聪明的死代码消除技巧)它看起来不像是有效的C.1)是的,这就是拥有一个结构的全部意义。2) 你不能。如果你的用例允许互斥使用任何成员,你可以将他们包装成一个联盟。根据您的示例,
in
out
成员将是两个候选成员。当然,如果您创建类型为
VALUE
的变量,则会为嵌套结构及其所有内容分配内存,而不管您是否“需要”它们。(OTOH,请参阅@Kiloreux关于优化编译器的回答,这些编译器可能会执行非常聪明的死代码消除技巧)它看起来不像是有效的C.1)是的,这就是拥有一个结构的全部意义。2) 你不能。如果你的用例允许互斥使用任何成员,你可以将他们包装成一个联盟。根据您的示例,
in
out
成员将是两个候选成员。@Peregring lk我是专门谈论整体变量的,现在struct被视为整体变量,它要么作为一个整体分配,要么作为一个整体取消。虽然这是可能的,但它将是非常烦人和危险的。“如果在一个结构中有一个残留成员被编译出来,并破坏IO读取的对齐,那将很糟糕。”Thilo让我思考。假设结构测试有五个成员。cpp使用三名成员。Y.cpp使用剩下的两个。除非编译文件的规则被彻底改变,编译器必须同时知道并处理两个编译单元,否则X不能调用Y中的函数,反之亦然,因为结构大小和偏移量将不同。这将是非常糟糕的。告别动态库链接。这是可以做到的,但是哇。这将需要一个巨大的范式转换。编译器完全消除结构的使用()是一回事,而编译器使用它的计算变量则是另一回事。即使使用整个程序优化,我也从未见过生成修改结构表示的代码,请参见(消除)与(保留)。我曾在mmo游戏和云计算领域工作过,优化非常重要。我认为C编译器不允许从结构中删除元素。一般来说,这样做是不安全的——所有编译单元必须在结构的大小和形状上达成一致。如果编译器可以看到整个程序,并检测到外部没有任何东西会受到结构更改的影响,那么也许可以做些什么,但我不知道C编译器实际上有这样的自由。@Peregring lk我是专门谈论变量作为一个整体,现在struct被认为是一个整体变量,它要么作为一个整体被分配,要么作为一个整体被取消。虽然这是可能的,但它将是非常烦人和危险的。在一个结构中有一个残存的成员被编译出来,然后把它吹走,这会很糟糕