服务器之家

服务器之家 > 正文

c/c++内存分配大小实例讲解

时间:2022-02-22 14:59     来源/作者:jihite

测试平台:linux 32位系统

用sizeof()运算符计算分配空间大小。单位:字节

1. 数组名与变量名的区别

?
1
2
3
4
5
6
7
8
9
10
int main()
{
    char q[] = "hello";
    cout << "q:" << sizeof(q) << endl;
    char *mq = q;
    cout << "mq:" << sizeof(mq) << endl;
 
    const char *p = "hello";
    cout << "p:" << sizeof(p) << endl;
}

结果

q:6
mq:4
p:4

分析

q是数组名,申请内存是编译器记住了,但是赋值给mq后,mq和p一样是一个普通的指针了,大小为4.

总之:c/c++没有办法知道指针所指的内存容量,除非在申请时记住它。

2. 类的内存分配

2.1 空类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
 
class A
{
};
 
int main()
{
    A a;
    cout << sizeof(a) << endl;
}

结果

1

分析

所谓类的实例化就是在内存中分配一块地址(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.因为如果空类不隐含加一个字节的话,则空类无所谓实例化了(因为类的实例化就是在内存中分配一块地址。

2.2 类只有成员变量

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
 
class A
{
    public:
        int val;
};
 
int main()
{
    A a;
    cout << sizeof(a) << endl;
}

结果

4

解释

这个4是int类型类的成员变量所占字节数

2.2 类含有成员函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
 
class A
{
    public:
        A(int value) : val(value) {}
        int val;
};
 
int main()
{
    A a(3);
    cout << sizeof(a) << endl;
}

结果

4

分析

这个4是int类型类的成员变量所占字节数。即成员函数没有占空间。原因是这样的:成员函数不属于类(或类的对象),所有的成员函数和全局函数都在代码段,在调用成员函数时,会隐式的通过this指针过去调用。

3.3 类中含有静态成员

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
 
class A
{
    public:
        A(int value) : val(value) {}
        int val;
        static int sta_val;
};
int A::sta_val = 3;
 
int main()
{
    A a(3);
    cout << sizeof(a) << endl;
}

结果

4

分析

这个4仍然是int类型类的成员变量所占字节数。static变量存放于静态区,并不和普通成员变量(存于栈)放在一起。

3.4 类中含有virtural函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
 
class A
{
    public:
        int val;
        virtual void fuc() { cout << "hello" << endl; }
};
 
 
int main()
{
    A a;
    cout << sizeof(a) << endl;
}

结果

8

分析

virtual 会增加4个字节大小的空间。原因:增加一个virtual ,会增加一个虚函数表指针(即使有多个虚函数,也仅有一个虚函数表),例证

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
 
class A
{
    public:
        int val;
        virtual void fuc() { cout << "hello" << endl; }
        virtual void fuc2() { cout << "hello" << endl; }
};
 
 
int main()
{
    A a;
    cout << sizeof(a) << endl;
}

结果

8

3.5 子类空间分配

例子1

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
 
class A
{
    public:
        int val;
};
 
class B : public A
{
    int valb;
};
 
 
int main()
{
    B b;
    cout << sizeof(b) << endl;
}

结果

8

例子2

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
 
class A
{
    public:
        int val;
        virtual void fuc() {}
};
 
class B : public A
{
    int valb;
};
 
 
int main()
{
    B b;
    cout << sizeof(b) << endl;
}

结果

Bb

分析

4 + 4 + 4(虚函数表指针)

到此这篇关于c/c++内存分配大小实例讲解的文章就介绍到这了,更多相关c/c++内存分配大小内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/kaituorensheng/p/3694587.html

标签:

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
返回顶部