关于c++类的一些小问题

假设 我定义了一个
class a
{
int c;
public:
void foo()
{
cout << 1 << endl;
}
};
假如我a b那么b里面包含了我的c和我的foo

那么为什么我sizeof(a) == 4
foo不占地方呢

如果foo占地方 那岂不是我创建的每个对象都要占用一定的内存 那岂
不是贼耗内存 那么干脆我都定义成static类算了 那我不就能够节约很多
空间

函数的地址和函数运行分配堆栈是两个概念。

需要明白,成员字段是每个对象都有一份副本的,也就是说,对象的大小是成员字段决定的,而与类中的函数无关。
a obj1;
a obj2;
obj1和obj2这2个对象都各自包含自己的一个成员字段c,互不影响。

函数都只存储一份,且不占对象 的空间。

因为函数本身也是数据,是指令的集合,一旦一个函数编写完了,它就固定化了,你能在运行过程中,把一个函数修改吗?当然是不可能的。
既然不能修改,那就共用一份不就OK呢吗?每次调用函数,我就去相同的地方找到这个函数并调用他。
也就是说:类a 的所有实例都可以调用函数foo,是共用了foo函数,而不是每个实例都存储一个foo函数。

记住:任何函数,(除了某些情况下的inline函数和宏函数),都只有一个副本。
那函数存储在哪里呢?
程序对虚拟地址空间的分区管理:栈区,堆区,数据区(bbs和已经初始化静态量),代码区。
函数被编译后形成的机器指令存储在代码区,这个区是只读的。
也就是说,所有的函数被存储在一个逻辑上独立的内存区域,和你程序中使用的局部变量,堆等都隔离开了。

给你一份测试代码:你会发现各个不同程序对象输出的地址存在明显的分段现象。

 #include<stdio.h>
 void foo()
{

}


void bar()
{

}

int global = 1000;

int main(void)
{
    int local = 1;
    int*p = new int;

    printf("-------函数的地址测试-------\n");
    printf("foo的地址:%p   ",foo); 
    printf("bar的地址:%p",bar); 
    puts("\n\n");


    printf("-------局部变量的地址测试-------\n");
    printf("local的地址:%p   ",&local); 
    puts("\n\n");


    printf("-------全局变量的地址测试-------\n");
    printf("gloabl的地址:%p   ",&global); 
    puts("\n\n");


    printf("-------堆地址测试-------\n");
    printf("p指向的堆的地址:%p   ",p); 
    puts("\n\n");



    return 0;
}

C/C++中的,函数名代表的值就是函数在内存中起始的地址,这也验证了函数在内存中存储的唯一性。