簡體   English   中英

不同編譯器中的指針大小

[英]Pointer sizes in different compilers

假設我們的目標是一個特定的硬件架構,一個特定的操作系統(如果適用)和一個特定的“位數”(32對64等)。 在這種情況下,它是安全的假設,不同的編譯器將使用相同sizeof(T*)對同一T 標准是否適用於這種或那種方式?

即使標准沒有保證,對於“用於正常使用和效率的大多數正常編譯器”,它是否適用? 我可以想象一個理論上的Hell ++會在允許的情況下使用不同的大小,但是人們實際使用的編譯器呢?

我也會對我看到與指針密切相關的其他類型感興趣( std::size_tstd::ptrdiff_tstd::intptr_t )。

作為一個“獎金問題”,可以說其他內置類型(例如charintfloatlong )嗎? 但是,在編譯器中遇到不同的大小並不會讓我感到驚訝。

編輯

還需要考慮一件事:這會受到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等)的大小也會因編譯器,體系結構甚至一些編譯器標志和設置而有很大差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM