【问题标题】:How much memory does it take for a structure that contains array of function pointers?包含函数指针数组的结构需要多少内存?
【发布时间】:2019-10-24 11:28:30
【问题描述】:

我有一个为假设的 CPU 编写的结构:

struct s {
  int m;
  void (*foo[13])(int);
  char s;

};

如果地址空间是 63 位宽,如果一个字节是 21 位(char 是 21 位),short、int 和 long 是 42 位,long long 是 168 位,我是否将指针放入 long long 类型,因为它们不适合 char、short、int 或 long?我需要 13*long long(168 位)来存储 13 个函数指针吗?

【问题讨论】:

  • 你试过调用printf("%zx", sizeof(struct s))吗?
  • 什么平台有 21 位字符和 63 位指针?
  • 显然,这是一个家庭作业,并使用一个假设的 CPU。由于地址是 63 位或每个 21 位的 3 个字节,因此您可能需要 3x13= 39 个字节的数组。但不能保证函数指针与对象指针的大小相同。但给出的信息并未表明函数指针的任何替代大小。
  • 这是一个假设的 CPU 这个问题似乎没有明确说明,因此 IMO 没有“正确”的答案。函数指针的对齐限制是什么?例如,它们是否必须在 4 字节(84 位)边界上对齐?
  • 指针的大小不必与任何现有的整数类型完全相同。函数指针可以是任意大小。我可以在这个平台上提出一个合理的实现,它有 1 字节宽的函数指针。或 2 或 3 个字节。问题中根本没有足够的数据。您的教授可能会也可能不会高兴听到这个消息。

标签: c memory structure


【解决方案1】:

(函数)指针的表示取决于实现。一个实现通常会(对于线性地址空间)使用类似于较长整数类型之一的东西;但没有要求这样做:指针很可能是 3 或 4 或 5 个字节长,并且在您的体系结构上可能会是 ;-)。 (n.m. 提出了一个有效的观点,即它们也可能具有 1 个字节的大小,我假设函数的数量限制为 2^21-1;对于您描述的实现,这实际上也是一个很好的猜测。)

对齐要求(或建议(以避免加载缓慢))取决于架构和实现。对齐数据以空间换取更高的速度:对齐的数据可以更快地写入和读取,但对齐需要填充。

编译器通常会提供以速度换取更高空间效率的方法,例如 #pragma pack。打包结构的布局的确切变化,就像实现它的方法一样,依赖于实现;但如果没有矛盾的信息,我会假设打包结构中没有填充。 (您可以并且应该通过检查sizeof(struct s) 在您的程序中证明这一点)。不期望在打包结构中有任何填充的原因是将其映射到预定义布局的硬件接口的用例。

为了在不运行程序的情况下得到明确的答案,我们需要编译器文档的相关部分,以便我们知道函数指针的大小和打包的效果。

【讨论】:

  • 但是这个假设的 CPU 并没有使用二次方的大小。
  • @JonathanLeffler 我在一处更正为sizeof char...
  • 如果我最后有 _attribute_(packed),这是否意味着结构不包含字段之间的填充位?
  • @miki1307 _attribute_(packed) 是非标准的。你怎么知道你假设的 CPU 甚至支持这样的非标准扩展?
  • @AndrewHenle 我有相同的结构,唯一的区别是它最后有 _attribute_(packed) 。这是一道作业题。
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
相关资源
最近更新 更多