c - 包含函数指针数组的结构需要多少内存?
问题描述
我有一个为假设的 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 个字节长,并且在您的体系结构上可能会是 ;-)。(nm 提出了一个有效的观点,即它们也可能具有 1 个字节的大小,我假设函数的数量限制为 2^21-1;这实际上也是您描述的实现的一个很好的猜测。)
对齐要求——或建议(以避免加载缓慢)——取决于架构和实现。对齐数据以空间换取更高的速度:对齐的数据可以更快地写入和读取,但对齐需要填充。
编译器通常提供以速度换取更高空间效率的方法,例如#pragma pack
. 打包结构的布局的确切变化,就像实现它的方法一样,依赖于实现;但如果没有矛盾的信息,我会假设打包结构中没有填充。(您可以并且应该通过检查在您的程序中证明这一点sizeof(struct s)
)。不期望打包结构中的任何填充的原因是将其映射到预定义布局的硬件接口的用例。
为了在不运行程序的情况下获得明确的答案,我们需要编译器文档的相关部分,以便我们知道函数指针的大小和打包的效果。
推荐阅读
- c# - 如何在 C# selenium 测试中处理 MFA
- sql - 只有一个用户时,登录名和密码的最佳做法是什么?
- ruby-on-rails - 查询 has_one 关联为 nil 的位置
- codenameone - 对话框未在android中显示
- objective-c - FunctionImport 抛出 500 内部错误
- php - PHP Swagger - 区域级别的路径
- ruby-on-rails - Ruby 从另一个散列创建新散列,其中包含来自第一个散列的特定值
- c# - 如何将自定义对象从类序列化为光子 onserializeview 的字节数组并返回类
- ios - 我在 Swift 中收到 Beams 身份验证令牌错误
- c# - 自定义导航栏 xamarin