我有一个为假设的 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/