假设我们的目标是一种特定的硬件架构、一种特定的操作系统(如果适用)和一种特定的“位数”(32 位与 64 位等)。在这种情况下,假设不同的编译器将对相同的 T
使用相同的 sizeof(T*)
是否安全?标准规则是这样还是那样?
即使标准没有保证,这是否适用于“大多数用于正常使用和效率的普通编译器?”我可以想象,如果允许的话,理论上的 Hell++ 会使用不同的大小,但人们实际使用的编译器又如何呢?
我也会对我认为与指针密切相关的其他类型感兴趣(std::size_t
、std::ptrdiff_t
、std::intptr_t
)。
作为“奖励问题”,可以对其他内置类型(例如 char
、int
、float
、长
)?但是,遇到跨编译器的不同大小并不会让我感到惊讶。
编辑
还有一点需要考虑:这会受到 extern "C"
链接的影响吗?作为应用程序的示例,如果我有一个发布此功能的库:
extern "C" void foo(void *);
理论上我可能无法正确调用该函数,因为库的编译器使用了与我的编译器不同的 sizeof(void*)
吗?
最佳答案
不,指向不同数据类型的指针不需要具有相同的大小。指针可能没有“预期”大小的一种特殊情况是指向成员函数的指针。为了能够支持虚函数,成员函数指针通常使用某种结构、指针数组等来实现。例如,在我的架构中,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
等)的大小也会因编译器、体系结构甚至某些编译器标志和设置而有很大差异。
关于c++ - 不同编译器中的指针大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16983670/