簡體   English   中英

為什么 function 指針 arguments 不影響 memory 大小?

[英]Why don't function pointer arguments affect memory size?

最近我在看 gl3w 庫的 src 代碼。 我注意到它為我使用了一種新型結構: union 我發現union是多種數據類型存在於同一個地方的一種方式。 但我注意到的是它在類型之間切換而沒有重新分配值。 It was switching from an array of pure c function pointers and a struct of function pointers with different amounts of arguments. 所以我做了一點測試:

#include <iostream>

typedef void (*PUREPROC)();
typedef void (*ARGSPROC)(int, int *);

int main() {
     std::cout << "PUREPROC's size is: " << sizeof(PUREPROC) << std::endl;
     std::cout << "ARGSPROC's size is: " << sizeof(ARGSPROC) << std::endl;

     return 0;
}

令我驚訝的是,兩者都使用了 8 個字節的 memory。 我了解 gl3w 如何能夠在數組和結構之間切換,它們使用了相同數量的 memory。 數組只是一個允許以更簡單的方式分配功能的工具。 我知道代碼有效並且理解它們沒有消耗不同數量的 memory,但我不知道為什么。 所以這就是我的問題:為什么 function 指針 arguments 不影響 memory 的大小?

function 指針仍然只是一個指針,即它包含一個 memory 地址。

它不包含任何關於指針指向的內容。 這是語言的一部分,而不是指針的表示。

Pointers to different types may have different sizes, and it is possible for a pointer to a function taking no arguments to have a different size and/or alignment from a pointer to a function taking some number of arguments (I can't imagine why they會,但有可能)。 它們也可能具有相同的大小和 alignment。

他們是否這樣做完全取決於具體的實現。 On systems with a "flat" memory model (modern Windows, MacOS, and Linux on x86 and x86-64, for example), all object pointer and function pointer types tend to be the same size. 在像 DOS 這樣的分段系統上,您有near (16 位)和far (32 位)指針,具體取決於您是否引用同一 memory 段中的某些內容。 哈佛架構將代碼和數據保存在物理上獨立的 memory 中,具有不同的地址總線大小,因此指向函數的指針可能與指向對象的指針具有不同的大小。

在 C++ 中,唯一的要求(無論如何,AFAICT)是指向合格類型的指針具有相同的大小,並且 alignment 作為指向它們的非限定等效項的指針,並且void *char *具有相同的大小和 Z5A159214B179FFF37D9

如果兩種不同的指針類型具有相同的大小,您永遠不會感到驚訝。 如果兩種不同的指針類型具有不同的大小(以上述要求為模),您永遠不會感到驚訝。

這是因為它只是一個與任何指針一樣的指針,但指向具有特定簽名的 function,以便編譯器可以推斷出如何在調用站點中進行調用。 指針通常是一個數字,包含它指向的 object 的地址,它(指針)具有編譯程序所針對的 cpu 拱門的大小。 所以 x64 指針是 8 字節 = 64 位,x32 指針是 4 字節 = 32 位等等

暫無
暫無

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

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