1

假设我们的目标是一种特定的硬件架构、一种特定的操作系统(如果适用)和一种特定的“位数”(32 与 64 等)。在这种情况下,假设不同的编译器对相同的编译器使用相同sizeof(T*)的编译器是否安全T?标准规则是否以这种方式或另一种方式?

即使标准不保证,这是否适用于“大多数用于正常使用和效率的普通编译器?” 我可以想象如果允许的话,理论上的 Hell++ 会使用不同的大小,但是人们实际使用的编译器呢?

我也会对我认为与指针 ( std::size_t, std::ptrdiff_t, std::intptr_t) 密切相关的其他类型感兴趣。

作为一个“额外的问题”,是否可以对其他内置类型(例如char, int, float, long)说些什么?但是,在编译器中遇到不同的大小并不会让我对这些感到惊讶。

编辑

还要考虑一件事情:这会受到extern "C"链接的影响吗?作为应用程序的示例,如果我有一个发布此功能的库:

extern "C" void foo(void *);

理论上是否有可能我将无法正确调用该函数,因为库的编译器使用的编译器sizeof(void*)与我的编译器不同?

4

1 回答 1

4

不,指向不同数据类型的指针不需要具有相同的大小。指针可能没有“预期”大小的一种特殊情况是指向成员函数的指针。为了能够支持虚函数,成员函数指针通常使用某种结构、指针数组等来实现。例如,在我的架构上,void *长度为 8 个字节,但(Foo::*)()为 16 个:

h2co3-macbook:~ h2co3$ cat quirk.cpp
#include <iostream>
#include <algorithm>

class Foo {
    public:
    void bar()
    {
        std::cout << "bar()" << std::endl;
    }
};

int main()
{
    std::cout << "sizeof void *: " << sizeof(void *) << std::endl;
    std::cout << "sizeof (Foo::*)(): " << sizeof(&Foo::bar) << std::endl;
    return 0;
}
h2co3-macbook:~ h2co3$ clang++ -Wall -o quirk quirk.cpp
h2co3-macbook:~ h2co3$ ./quirk
sizeof void *: 8
sizeof (Foo::*)(): 16

其他类型(int,float等)的大小也会因编译器、体系结构甚至某些编译器标志和设置而有很大差异。

于 2013-06-07T12:10:12.807 回答