0

可能重复:
编译后的 C++ 类是什么样子的?

大家好,

 bash$cat struct.c
struct test
{
int i;
float f;
};

bash$gcc -c struct.c

目标文件 struct.o 是 elf 格式。我试图了解这个目标文件包含什么。源代码只是一个结构的定义。这里没有可执行文件,所以文本中应该没有任何内容,也没有真正的数据。那么 struct 的定义到底去哪儿了呢?

我尝试使用;

readelf -a struct.o
objdump -s struct.o

但不太明白这一点。

谢谢,

贾格拉蒂

4

4 回答 4

4

空无一物。它不存在。你什么都没有创造,也什么都没有使用。

结构的定义在编译时使用。该定义通常会放在非编译的头文件中。使用结构时会生成一些代码。该定义会影响编译器在点生成的内容。

这就是为什么针对一个库的一个版本进行编译然后在运行时使用另一个版本会导致程序崩溃的原因。

于 2010-07-09T10:47:17.313 回答
3

So where does the definition of struct go really?

Struct definition usually goes to /dev/null. C does not have any introspection features, so struct definition is not needed at run time. During compilation, calls to struct fields are converted to numeric offsets, eg. x->f would be compiled to equivalent of *((void*)x + sizeof(int)). That's why you need to include headers every time you use struct.

于 2010-07-09T10:57:14.257 回答
2

结构没有被编译,它们被声明。不过,函数会被编译。

于 2010-07-09T10:49:46.230 回答
2

我不是专家,我实际上无法回答这个问题……但我想到了这一点。内存就是内存:如果你使用 1 个字节作为整数或字符,它仍然是一个字节。结果仅取决于编译器。那么,为什么结构不能相同呢?我的意思是,编译器可能会计算要分配的内存(因为您的计算机可能会分配 WORDS 的内存,而不是字节,如果您的结构是 1 个字节长,可能会添加 3 个字节以允许分配 4 个字节的字),并且那么 struct 在访问数据时将只是您的“参考”。我认为实际上没有必要在下面有一些东西:编译器足以知道,在编译时,如果您引用结构的字段“名称”,它将被视为长度为 X 的字符数组.

正如我所说,我不是这样的内部专家,但正如我所见,没有必要将结构转换为“真实代码”......它只是编译器的注释,可以在之后销毁编译完成。

于 2010-07-09T10:50:00.753 回答