c++ - 不同编译器中的指针大小

标签 c++ types sizeof

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

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

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

作为“奖励问题”,可以对其他内置类型(例如 charintfloat)?但是,遇到跨编译器的不同大小并不会让我感到惊讶。

编辑

还有一点需要考虑:这会受到 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

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

关于c++ - 不同编译器中的指针大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16983670/

相关文章:

c++ - 找出多态对象的大小

c++ - 这个模板参数是什么?

c++ - 如何使用枚举值通过预处理器指令直接编译

python - 如何在 Python 或函数式编程语言中创建函数扩展/函数接口(interface)/函数类?

c# - 如何调用返回接口(interface)的方法

c++ - 努力获取 char* 中的字符数

c - 这两行有什么区别?

c++ - 如何从.exe项目导入代码进行单元测试

c++ - 链接器需要 lib 文件名称中的编译器和 Boost 版本。 fatal error LNK1104

angular - Protractor @types 抛出很多错误