gpt4 book ai didi

c++ - C/C++ union 中元素的内存位置

转载 作者:IT老高 更新时间:2023-10-28 22:26:19 25 4
gpt4 key购买 nike

我在 C 中有一个这样的 union :

union AUnion {
struct CharBuf {
char *buf;
size_t len;
} charbuf;
uint8_t num;
double fp_num;
};

我的问题是,如果给出以下条件,我能否保证:

union AUnion u;

那么以下是正确的:

&u == &u.num
&u == &u.fp_num
&u == &u.charbuf

即它们都从存储 u 的内存段的开头开始。

对于使用 gcc version 5.3.0-std=c11 编译的这个 C 程序,上述情况是正确的:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

union AUnion {
struct CharBuf {
char *buf;
size_t len;
} charbuf;
uint8_t num;
double fp_num;
};

int main(void)
{
union AUnion u;
printf("%d\n", ((void*)&u) == ((void*)&u.charbuf));
printf("%d\n", ((void*)&u.charbuf) == ((void*)&u.num));
printf("%d\n", ((void*)&u.num) == ((void*)&u.fp_num));
}

打印时:

1
1
1

使用相同的编译器将上述代码编译为 C++11 会产生与将其编译为 C11 相同的输出。

但这是标准化的行为吗?它是未定义的吗?我可以依赖大多数 C 编译器的这种行为吗?我可以期待 C++ 编译器也有这种行为吗?

最佳答案

6.7.2.1p16 C 标准保证:

The size of a union is sufficient to contain the largest of its members. The value of at most one of the members can be stored in a union object at any time. A pointer to a union object, suitably converted, points to each of its members (or if a member is a bit- field, then to the unit in which it resides), and vice versa.

所以,是的,您可以依赖从 union 的地址开始的所有成员(注意,对于 struct 的第一个成员也是如此)。

C++ 标准包含一个关于 C 风格(即只有 C 风格成员)unions/structs 的类似句子,因为 C++ 允许通过 unions 到需要这种布局的 C 函数。C++ 标准中的相关部分是 9.5。


然而,请注意在标准简单类型(整数、 float )中可能存在填充。并且它们的内部可能会有所不同(字节序)。您还可能违反严格别名规则(C:有效类型)。

关于c++ - C/C++ union 中元素的内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36824637/

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