Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指针的大小和体系结构 通过在普通的桌面PC上运行一个简单的C++程序进行基本测试,假设任何类型的指针(包括指向函数的指针)的大小等于目标体系结构位,似乎是合理的。p>_C++_C_Assembly_Portability - Fatal编程技术网

指针的大小和体系结构 通过在普通的桌面PC上运行一个简单的C++程序进行基本测试,假设任何类型的指针(包括指向函数的指针)的大小等于目标体系结构位,似乎是合理的。p>

指针的大小和体系结构 通过在普通的桌面PC上运行一个简单的C++程序进行基本测试,假设任何类型的指针(包括指向函数的指针)的大小等于目标体系结构位,似乎是合理的。p>,c++,c,assembly,portability,C++,C,Assembly,Portability,例如:32位体系结构->4字节,64位体系结构->8字节 不过我记得读到过,一般情况下不是这样的 所以我想知道会是什么样的情况 数据类型指针大小与指针大小相等 到其他数据类型 数据类型指针大小与指针大小相等 发挥作用 目标体系结构指针大小相等 目标体系结构“位”表示寄存器大小。例如,Intel 8051是8位的,在8位寄存器上运行,但是(外部)RAM和(外部)ROM是用16位值访问的。为了正确起见,您不能假设任何东西。你必须检查并准备好处理奇怪的情况 一般来说,这是一个合理的违约假设 然而,这

例如:32位体系结构->4字节,64位体系结构->8字节

不过我记得读到过,一般情况下不是这样的

所以我想知道会是什么样的情况

  • 数据类型指针大小与指针大小相等 到其他数据类型
  • 数据类型指针大小与指针大小相等 发挥作用
  • 目标体系结构指针大小相等
目标体系结构“位”表示寄存器大小。例如,Intel 8051是8位的,在8位寄存器上运行,但是(外部)RAM和(外部)ROM是用16位值访问的。

为了正确起见,您不能假设任何东西。你必须检查并准备好处理奇怪的情况

一般来说,这是一个合理的违约假设

然而,这并不是普遍正确的。例如,请参阅,它在64位体系结构上使用32位指针来节省一点内存和缓存占用空间。AArch64上的ILP32 ABI也是如此

所以,对于猜测记忆的使用,你可以使用你的假设,它通常是正确的

可以合理地假设,在一般情况下,任何类型的指针(包括指向函数的指针)的大小都等于目标体系结构位

视情况而定。如果你的目标是快速估计内存消耗,那就足够了

(包括指向函数的指针)

但这里有一条重要的评论。虽然大多数指针大小相同,但函数指针可能不同。不能保证
void*
能够保存函数指针。至少,C是这样的。我不知道C++。< /P> 所以我想知道如果有的话会是什么样的情况

这可能是很多不同的原因。如果你的程序的正确性取决于这个大小,那么做这样的假设是绝对不合适的。检查一下。这一点也不难

您可以使用此宏在C中的编译时检查以下内容:

#include <assert.h>
static_assert(sizeof(void*) == 4, "Pointers are assumed to be exactly 4 bytes");

如果你使用C++,你可以跳过<代码>包含< /COD>。因为<代码> STATICO-AsHyth是C++中的关键字。(您可以在C中使用关键字

\u Static\u assert
,但它看起来很难看,所以请改用include和宏。)


由于这两行代码非常容易包含在代码中,因此,如果您的程序无法在错误的指针大小下正常工作,那么没有理由不这样做。

不,这是不合理的假设。做出这样的假设可能会导致错误

<> C或C++中指针(和整数类型)的大小最终由C或C++实现。正常的C或C++实现受到它们所针对的体系结构和操作系统的严重影响,但它们可以根据执行速度以外的原因选择它们的类型的大小,例如支持较小的内存使用的目标,支持未被写入到任何类型大小的完全可移植的代码。或者支持更容易地使用大整数


我见过一个针对64位系统但提供32位指针的编译器,用于构建内存使用量较小的程序。(据观察,指针的大小是内存消耗的一个相当大的因素,这是由于使用了许多具有许多连接的结构和使用指针的引用。)在编写源代码时假设指针大小等于64位寄存器大小,则会中断。

这是不正确的,例如DOS指针(16位)可以是远(seg+ofs)

然而,对于通常的目标(Windows、OSX、Linux、Android、iOS),这是正确的,因为它们都使用依赖于分页的平面编程模型

从理论上讲,在x64中也可以使用仅使用较低32位的系统。例如,链接的Windows可执行文件没有使用LargeAddressware。不过,这是为了帮助程序员避免切换到x64时出现错误。指针被截断为32位,但仍然是64位

在x64操作系统中,这种假设总是正确的,因为平坦模式是唯一有效的模式。CPU中的长模式强制GDT条目为64位平坦

还有人提到x32 ABI,我相信它基于相同的分页技术,强制所有指针映射到较低的4gb。但是,这必须基于与Windows相同的理论。在x64中,只能使用平面模式

在32位保护模式下,您可以有多达48位的指针。(分段模式)。您也可以有调用门。但是,没有操作系统使用该模式

可以合理地假设,在一般情况下,任何类型的指针(包括指向函数的指针)的大小都等于目标体系结构位

这可能是合理的,但并不可靠地正确。因此我猜答案是“不,除非你已经知道答案是肯定的(并且不担心可移植性)”

可能:

  • 系统可以有不同的寄存器大小,并使用不同的底层宽度进行数据和寻址:“目标体系结构位”对于这样的系统来说意味着什么并不明显,因此您必须选择特定的ABI(一旦您选择了,您就知道了该ABI的答案)

  • 系统可能支持不同的指针模型,例如旧的
    指针;在这种情况下,您需要知道代码编译的模式(然后知道该模式的答案)

  • 系统可能支持不同的指针大小,如前面提到的X32 ABI,或描述的其他流行64位数据模型
最后,还有
$ gcc main.c 
In file included from main.c:1:
main.c:2:1: error: static assertion failed: "Pointers are assumed to be exactly 4 bytes"
 static_assert(sizeof(void*) == 4, "Pointers are assumed to be exactly 4 bytes");
 ^~~~~~~~~~~~~