Oli*_*rth 16
指针是由高级语言提供的抽象; 理论上它可以是任何宽度.这完全是编译器的一时兴起.
实际上,它通常与底层硬件的内存地址的宽度有关,因为这通常是编译器实现的最有效的方法.但也有例外; 例如,C++的指向成员函数的指针没有直接映射到硬件地址,因为它需要表示两个实体(函数和类型的一些概念).
然而,即使把它放在一边,仍然存在复杂性.例如:
这个问题最初标记为C和C++,而不是"语言不可知".作为一个与语言无关的问题,它应该被视为过于宽泛,但我希望OP将其恢复为原始版本1,因此我不投票结束.作为一个C/C++问题,虽然它显然是负责任的,但它被视为过于宽泛,然后当范围被大大扩展到无法回答时,通过将该标记更改为与语言无关,它被重新打开为现在可以回答.
我正在回答C++的原始问题,在这里和那里散布了一些C知识.
我认为目前的"语言不可知"问题是无法回答的,尽管有一种尝试与语言无关的答案.
1.指针的大小取决于什么?
普通数据指针所需的最小尺寸取决于指向类型或不同功能的对象的可能存储位置的最大数量; 为了区分n个可能的位置,需要ceil(lg2(n))位.
因此,最小指针大小取决于最大可能的内存大小.
因此,最小指针大小也取决于指向类型的对齐.在某些现在过时机,并且甚至可能在某些现存机器(主机?),存储器的硬件水平可寻址单元是一个字例如2或4个字节的.然后可以用小指针来寻址字对齐的数据,同时char*还void*需要更大.
因此,在§3.9.2/ 4的C++ 11标准要求"类型的对象CV void*应具有相同的表示和对准要求CV char* ".
C++中的成员函数指针更类似于偏移而不是指针,并且通常比正确的指针更大.
2.架构的哪些特性会影响指针的大小?(详细地)
从C++可以看出主要是可记录的内存范围.
但是值得回顾的是,在MS-DOS编程中,一个区分了近指针和远指针.甲靠近指针被偏移到存储器隐含64k段,而远指针,两倍大小,组合的段选择和偏移量.
在(仍)现代32位PC编程中,C和C++指针通常类似于近指针,不支持远指针,即6个字节.要使用这样的指针,必须使用汇编语言等其他语言.
3.编译器是否会影响指针的大小?怎么样?
使用的编译器和编译选项原则上可以影响指针大小,因为标准没有规定大小.例如,它原则上可以添加信息以帮助调试.或者如上所述,使用语言扩展可以有近距离和远距离指针.
由于成员指针不是直接地址(在引擎盖下),因此编译器如何表示它们以及它们的大小非常重要.
这也取决于使用的选项.
4.有哪些不同类型的指针以及它们如何彼此不同?(例如:函数指针和指向基本数据类型的指针之间是否存在差异?指针与远指针等附近)
在C++ 03中,函数指针无法转换为数据指针,反之亦然.这种限制支持具有哈佛架构的机器,并且它支持可能的不同大小的函数指针和数据指针(例如,前者为远,后者为近).在C++ 11中,有条件地支持这种转换,在§5.2.10/ 8中,由缺陷报告195产生.
值得注意的是,Posix标准需要支持转换(函数指针)→(void*)和返回,例如对于dlsym函数.
上述有效意味着对象指针和函数指针是不同的.例如,后者不支持地址算术.此外,成员指针与正确的指针不同,更类似于偏移.
Modern C++不支持near指针和远指针.
5.语言是否对指针有影响.C vs C++
C不支持成员指针,在这个问题中它们被认为是指针.
除此之外,C++的主要目标是能够直接使用C库,并将C标准"合并"(C++11§17.5.1.5/ 1)到C++标准中,这需要兼容的指针表示.
C支持限制指针,限定符restrict,C++不支持.但是,这只会影响编译器对指针可能值的了解.这意味着C编译器可能能够发出更好的优化代码.