c - 包含函数指针数组的结构需要多少内存?

标签 c memory structure

我有一个为假设的 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个函数指针吗?

最佳答案

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

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

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

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

关于c - 包含函数指针数组的结构需要多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58540376/

相关文章:

Android 如何获得设备中的总内存 RAM?

java - 如何从任何java结构的SQL表中一次性检索分层项目进行比较?

c-尝试添加到 Struct 中的 char 数组时出现段错误

C结构;克服将字符串传递给 char

在输出文件中没有任何附加数据的情况下编译和链接 C 代码

c - PowerPC 从内存中的已知地址加载方法地址并调用该方法

Java : Array content is automatically updated, 被其他线程更新后,没有任何同步语句?

sockaddr_in 结构中 "localhost"的 C Linux 宏?

c++ - 多线程应用程序中注入(inject)的 mprotect 调用的切换标志

python - .view() 在 PyTorch 中做了什么?