c: 空隙大小*

Posted

技术标签:

【中文标题】c: 空隙大小*【英文标题】:c: size of void* 【发布时间】:2011-10-18 00:45:06 【问题描述】:

我对 C 中的 void* 指针有点困惑。尤其是在阅读了这个问题之后:Is the sizeof(some pointer) always equal to four?,有人说不能保证 sizeof(int *) == sizeof(double *)

我的问题是:是否有 sizeof(void*) >= sizeof(任何其他指针类型)的保证? 换句话说,我是否可以始终将 some_type* 指针分配给 void* 指针,然后将其作为 some_type* 取回?

【问题讨论】:

【参考方案1】:

只有数据指针。 void * 可以保存任何数据指针,但不能保存函数指针。

这是C FAQ。

void * 只保证保存对象(即数据)指针;它 不能将函数指针转换为 void * 类型。 (一些 机器,函数地址可以非常大,比任何数据都大 指针。)

至于第一部分,是的,不同类型可以有pointers of different sizes:

【讨论】:

然而,不同大小的指针在现代系统中很少甚至不存在。 并注意“可以容纳”,而不是“至少一样大”。标准中没有任何内容表明,例如,double* 指针不能浪费大而不能使用它们的一些位。即使void* 可以保存double* 的每个值,您也可以拥有sizeof(double*) > sizeof(void*) 目前还没有任何论据说服我(当然,std 是圣经,但它的设计可能很糟糕):必须存在一个能够保存“最大”“指针”的“寄存器”;我希望“void *”是所有可能指针的“联合”,因此它可以表示真正的“指向任何东西的指针”。在我可以使用它之前,我需要将它转换,然后它必须获得一个“特定的形式”。但是 sizeof(void *) 应该给出“最大”的大小,也能够保留函数指针(不管它们是什么) @ShinTakezou:一个反例是一个指针不是很紧凑的系统,例如经典 x86:取消引用时需要 16+16 位指针,但它们仅包含 20 位信息。由于您从不取消引用 void*,因此它不需要是 32 位,但可以是 24 位。 在这种情况下,值得注意的是,POSIX 公然违反了 C 标准中的这一点,要求 void* 可以 实际上持有一个方法指针。【参考方案2】:

存储在指针中的值是内存地址。如果您使用的是 32 位系统,则指向内存的指针将是 32 位(或四个字节)长。如果您使用的是 64 位系统,则指向内存的指针将是 64 位(或 8 个字节)长。

内存中保存该位置的数据大小与内存中该位置所表示的数据大小无关。

至于char *double * 的不同之处,char * 可以指向任何位置,但double * 必须指向沿八字节边界的东西。较大的数据必须根据您所在处理器的规则进行对齐。因此,指向小数据的指针通常与指向大数据的指针不兼容(例如,您不应将 double * 指针指向 char * 地址);但是您可以避免朝另一个方向前进(例如,您可以将char * 指针指向double * 地址)。

【讨论】:

这是一个很好的实用答案,但看起来 OP 正在寻找一个标准的迂腐答案。 正如克里斯所说。你在这里表达的是实践告诉我们的,但就语言标准而言,所有的赌注都没有。 ;-) 语言规则是为了在寻址不规则的系统上允许实现。语言设计者是故意这样做的。 +1 。但并非所有可能的机器都需要对齐。虽然,它很常见(即是这样);例如如果我没记错的话,68020 可以在读取字 (16) 或长字 (32) 数据时访问奇数地址,尽管访问速度较慢(因此,对齐数据将使您的程序运行得更快) 我需要系统示例,其中寻址“不规则”并且语言无法隐藏它(我可以接受标准作家以这种方式写的唯一原因, 是不是隐藏和允许指针无论如何都是指针的“直观”事实是不可能的......)

以上是关于c: 空隙大小*的主要内容,如果未能解决你的问题,请参考以下文章

css怎么让一张图片适应任何屏幕大小的电脑平铺?

HIVE查询性能-数据块大小

moz-transform scale减少div大小问题

在Python中提取完全覆盖矩形空间的随机大小的三角形列表[关闭]

mfix中统计气泡体积

插入排序的效率问题