【问题标题】:How are structs actually implemented in the C programming language? [duplicate]结构是如何在 C 编程语言中实际实现的? [复制]
【发布时间】:2018-02-06 11:30:29
【问题描述】:

结构是C编程语言中的复合数据结构;它们由诸如整数和指针之类的原语组成,它们都以相邻的方式(例如数组)放置在内存中。

我的问题是,结构本身是由什么组成的?它们是一种数组吗?例如,哈希表可以实现为链表数组。以类似的方式,结构实现为什么? 如果需要,请在 x86 汇编级别解释。谢谢。

【问题讨论】:

  • 0s 和 1s...这有点太宽泛了。
  • 据我所知,不像数组。数组是连续的,但结构可能包含填充。
  • 它们不是“用语言本身”实现的。 C 实现使用结构定义作为访问一块内存的指南(以实现定义的方式)。翻译后,任何人类可读的“结构”概念都消失了。
  • 它们不是元数据,它们只是数据。您可以将其视为一种抽象,就像数组一样。你只说某物是一个数组,如果它是有意义的,因为对它执行的操作,是进行的访问。但是你很可能只是说它们是不同的变量。在汇编级别实际上只有变量。
  • 再次错误重复。 C 和 C++ 是不同的语言,因此对象布局有不同的规则

标签: c assembly struct x86


【解决方案1】:

在汇编级别结构归结为通过对应于结构成员的偏移量访问的地址。

根据对齐规则和存储类为结构实例分配内存。

例子:

struct A
{
  int a,
  char b
}a1;

在上述情况下,如果您编写 a1.b = 5,它的汇编等效项将是:

MOV 5 TO ADDRESS OF a1 + 4 //假设整数大小为4

【讨论】:

  • 很好的解释。下一级的复杂性是允许编译器优化掉struct 变量,就像对其他对象一样。结构不必有地址;即使没有优化,成员值也可以保存在寄存器中。 (例如,在内联一个按值返回结构的函数之后)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
相关资源
最近更新 更多