[英]Pointer sizes in different compilers
假設我們的目標是一個特定的硬件架構,一個特定的操作系統(如果適用)和一個特定的“位數”(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*)
嗎?
不,指向不同數據類型的指針不需要具有相同的大小。 指針可能沒有“預期”大小的一個特殊情況是指向成員函數的指針。 為了能夠支持虛函數,成員函數指針通常使用某種結構,指針數組等來實現。 例如,在我的架構上, 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
等)的大小也會因編譯器,體系結構甚至一些編譯器標志和設置而有很大差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.