当前位置:  开发笔记 > 编程语言 > 正文

sizeof(某些指针)总是等于4吗?

如何解决《sizeof(某些指针)总是等于4吗?》经验,为你挑选了8个好方法。

例如: sizeof(char*)返回4一样int*,long long*,我已经竭尽所能.这有什么例外吗?



1> David Thornl..:

你得到的保证就是这样sizeof(char) == 1.没有其他保证,包括不保证sizeof(int *) == sizeof(double *).

实际上,指针在16位系统上的大小为2(如果你能找到一个),在32位系统上是4,在64位系统上是8,但是依靠给定的东西没有任何好处.尺寸.


在24位系统上有3个字节.是的,我曾经做过一个.欢迎来到嵌入式设备的世界.
我也在使用20位指针的16位系统.在这种情况下,我应该去看看sizeof返回的内容......
另一个保证是sizeof(char*)== sizeof(void*),因为它们必须具有相同的表示形式(object [size]和value [与其值相关的位组]表示)
由于问题要求例外,应该注意非静态成员函数指针通常与普通指针的大小不同,并且还因平台,类型等而异.除此之外.
@monjardin:IIRC,8086就是这样.有一个16位地址和一个4位段寄存器.我相信一个正常的"NEAR"指针是16位,一个声明为"FAR"的指针更多,可能是24位,虽然我不确定.
@ JohannesSchaub-litb:标准在哪里说`sizeof(char *)== sizeof(void *)`?

2> Eclipse..:

即使在普通的x86 32位平台上,您也可以获得各种指针大小,试试这个例子:

struct A {};

struct B : virtual public A {};

struct C {};

struct D : public A, public C {};

int main()
{
    cout << "A:" << sizeof(void (A::*)()) << endl;
    cout << "B:" << sizeof(void (B::*)()) << endl;
    cout << "D:" << sizeof(void (D::*)()) << endl;
}

在Visual C++ 2008下,我得到了指向成员函数的指针大小的4,12和8.

Raymond Chen 在这里谈到了这一点.


@Eclipse是的:char <= short <= int <= long <= long long
成员函数的指针是一个真正的痛苦.遗憾的是,并非所有编译器都像Digital Mars C++编译器一样,在所有情况下返回4.
@ Gob00st:唯一定义的是char是1.其他类型可以是与该编译器相关的任何大小.这些指针类型之间不需要一致性.

3> dmityugov..:

只是已发布列表的另一个例外.在32位平台上,指针可以占用6 个字节,而不是4个字节:

#include 
#include 

int main() {
    char far* ptr; // note that this is a far pointer
    printf( "%d\n", sizeof( ptr));
    return EXIT_SUCCESS;
}

如果你使用Open Watcom编译这个程序并运行它,你将得到6,因为它支持的远指针包括32位偏移和16位段值


不是段,而是选择器 - 它不是内存地址的一部分,而是LDT或GDT中的索引条目并且具有一些访问标志
好例子!+1

4> FryGuy..:

如果你正在为64位机器编译,那么它可能是8.


@AaronMcDaid我确实是指sizeof(char*).sizeof(char)总是1.但是如果你的机器字是64位,并且你的开发环境是以CHAR_BITS = 64的方式实现的,那么指针可能与char匹配在同一个空间中,因此也是1.
虽然情况通常如此,但并不一定如此.例如,如果你在64位机器上编译字大小为64位,那么sizeof(char*)可能是1.更不用说甚至普通机器中更奇特的指针类型,如Eclipse和dmityugov写道.

5> Joseph Garvi..:

从技术上讲,C标准只保证sizeof(char)== 1,其余的由实现决定.但在现代x86架构(例如Intel/AMD芯片)上,它是相当可预测的.

您可能听说过处理器被描述为16位,32位,64位等.这通常意味着处理器使用N位作为整数.由于指针存储内存地址,而内存地址是整数,因此这有效地告诉您将使用多少位作为指针.sizeof通常以字节为单位,因此为32位处理器编译的代码将报告指针大小为4(每位32位/ 8位),64位处理器的代码将报告指针大小为8 (每字节64位/ 8位).这就是32位处理器4GB RAM的限制来自 - 如果每个存储器地址对应一个字节,为了满足更多存储器需要大于32位的整数.


@SangeethSaravanaraj:为了向后兼容32位代码,他们决定将int继续为4个字节,并要求您通过指定'long'来选择使用8字节类型.long实际上是x86-64上的原生单词大小.一种看待这种情况的方法是,通常编译器会填充结构以使它们字对齐(尽管可能存在字大小和对齐无关的体系结构),因此如果你在其中创建一个带有int(32位)的结构,如果你回来8你就知道它将它们填充到64位字大小,并在其上调用sizeof().

6> Darron..:

除了16/32/64位差异之外,甚至可能发生更奇怪的事情.

有一些机器,其中sizeof(int*)将是一个值,可能是4,但sizeof(char*)更大.自然地处理单词而不是字节的机器必须"扩充"字符指针,以指定您真正想要的单词部分,以便正确实现C/C++标准.

现在这非常不寻常,因为硬件设计人员已经学会了字节寻址能力的价值.


用于Cray向量机的C编译器,例如T90,做类似的事情.硬件地址为8个字节,指向8个字节的字.`void*`和`char*`在软件中处理,并在字内增加3位偏移量 - 但由于实际上没有64位地址空间,因此偏移量存储在高位命令64位字的3位.因此`char*`和`int*`是相同的大小,但具有不同的内部表示 - 并且假定指针"真的"只是整数的代码可能会严重失败.

7> Rndp13..:

指针的大小基本上取决于实现它的系统的体系结构.例如,32位指针的大小在64位机器中是4字节(32位)和8字节(64位).机器中的位类型只是它可以拥有的内存地址.32位机器可以有2^32地址空间,64位机器可以有最多2^64地址空间.因此,指针(指向内存位置的变量)应该能够指向2^32 for 32 bit and 2^64 for 64 bit机器所拥有的任何内存地址().

由于这个原因,我们看到指针的大小在32位机器中是4个字节,在64位机器中是8个字节.



8> Kobor42..:

在大多数低调微控制器中使用8位和16位指针.这意味着每台洗衣机,微型冰箱,冰箱,旧电视,甚至汽车.

你可以说这些与现实世界的编程无关.但这里有一个真实世界的例子:Arduino,1-2-4k ram(取决于芯片),带有2个字节的指针.

它最近,价格便宜,适合所有人,值得编码.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有