C++ 为什么不';函数指针参数影响内存大小?

C++ 为什么不';函数指针参数影响内存大小?,c++,memory,function-pointers,sizeof,C++,Memory,Function Pointers,Sizeof,最近我在看gl3w库的src代码。我注意到它为我使用了一种新的结构:一个联合体。我发现,联合是多个数据类型存在于同一位置的一种方式。但我注意到它在类型之间切换,而不重新分配值。它从纯c函数指针数组和具有不同数量参数的函数指针结构转换而来。所以我做了一点测试: #include <iostream> typedef void (*PUREPROC)(); typedef void (*ARGSPROC)(int, int *); int main() { std::cou

最近我在看gl3w库的src代码。我注意到它为我使用了一种新的结构:一个
联合体
。我发现,
联合
是多个数据类型存在于同一位置的一种方式。但我注意到它在类型之间切换,而不重新分配值。它从纯c函数指针数组和具有不同数量参数的函数指针结构转换而来。所以我做了一点测试:

#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;
}
#包括
typedef void(*PUREPROC)();
typedef void(*ARGSPROC)(int,int*);
int main(){

函数指针仍然只是一个指针,即它包含一个内存地址


它不包含指针指向的任何内容。这是语言的一部分,不是指针的表示形式。

这是因为它与任何指针一样只是一个指针,但指向具有特定签名的函数,因此编译器可以推断如何在调用站点中进行调用。指针通常是一个数字containing它指向的对象的地址,一个it(指针)具有编译程序所用cpu的大小。因此,x64指针为8字节=64位,x32指针为4字节=32位,依此类推,指向不同类型的指针可能具有不同的大小,指向不带参数的函数的指针可能与指向带参数的函数的指针具有不同的大小和/或对齐方式一些参数(我无法想象为什么会这样,但这是可能的)。它们也可能有相同的大小和对齐方式

它们是否存在完全取决于具体的实现。在具有“扁平”内存模型的系统上(例如,x86和x86-64上的现代Windows、MacOS和Linux),所有对象指针和函数指针类型往往大小相同。在DOS这样的分段系统上,您有
(16位)和
(32位)指针取决于是否引用同一内存段中的内容。哈佛体系结构将代码和数据保存在物理上独立的内存中,具有不同的地址总线大小,因此指向函数的指针的大小可能与指向对象的指针的大小不同

在C++中,唯一的要求(AFAICT,无论如何)是指向限定类型的指针与它们的不合格等价物的指针具有相同的大小和对齐方式,并且<>代码> Vult*< /C>和 char */Cuff>具有相同的大小和对齐方式。
如果两种不同的指针类型具有相同的大小,您永远不会感到惊讶。如果两种不同的指针类型具有不同的大小,您永远不会感到惊讶(按上述要求进行模化).

因为函数指针只是在调用函数时将控件传输到的内存地址。不管函数参数的细节如何(或函数的任何其他内容),指针的大小都是相同的换言之,检查编译程序中的任何函数参数的类型,而不是运行时的程序。因此,函数指针不需要存储关于参数的任何信息。这些语句在C++中是否必须是真的(是否已成为标准的一部分)。比如说,一些C++实现想要实现函数的认证指针,这就要求函数指针包含比对象指针更多的位。C++标准禁止吗?它禁止指针指向指针指向的信息吗?