一些可变长度对象(string对象、vector对象 ...)作为结构体或类的成员,会不会动态改变结构体或类所定义的变量的大小呢?
2017-11-21 13:23
323 查看
可能是我自身的原因,经常性的杞人忧天!
在接触到C++的一些类时,想的有点多了。事实证明,我确实想多了。但是我觉得可能会有和我一样会多想的小伙伴,我在这分享一个我想多了的栗子!
以前,C语言写结构体时。结构体成员都是基本类型,比如int、char、double之类的,最多也就里边再套一个结构体成员,但它们都有一个特点。它们的大小是固定的,我不会有这样的担心。但是,我接触到string、vector这些类类型时,根据它们的特性:它们能动态扩充,就是你来多少内容,我都能存的下!
然后,我就想:那它们的变量大小是不是也扩充了,那是不是也导致所处的结构体的变量的大小也改变了呢?
因此,我查了下书。找到了答案:总结一下,简单来说就是,这些动态可变更存储长度的类都是使用指针,附加动态申请内存实现的。而动态申请的内存本身并不包含在对象的本身大小上面,在对象中保存一个指针,它能够找到动态申请的内存的地址。所以,你不管动态申请多少内存,它对象中的一个指针总能找得到你,它指针的大小不会发生改变。也就是说,它所在的结构体变量的大小也是不会改变的!
我也写了一个小程序检查了一下,大家可以通过运行结果看到结构体变量的大小并没有改变!
源程序:
运行截图:
在接触到C++的一些类时,想的有点多了。事实证明,我确实想多了。但是我觉得可能会有和我一样会多想的小伙伴,我在这分享一个我想多了的栗子!
以前,C语言写结构体时。结构体成员都是基本类型,比如int、char、double之类的,最多也就里边再套一个结构体成员,但它们都有一个特点。它们的大小是固定的,我不会有这样的担心。但是,我接触到string、vector这些类类型时,根据它们的特性:它们能动态扩充,就是你来多少内容,我都能存的下!
然后,我就想:那它们的变量大小是不是也扩充了,那是不是也导致所处的结构体的变量的大小也改变了呢?
因此,我查了下书。找到了答案:总结一下,简单来说就是,这些动态可变更存储长度的类都是使用指针,附加动态申请内存实现的。而动态申请的内存本身并不包含在对象的本身大小上面,在对象中保存一个指针,它能够找到动态申请的内存的地址。所以,你不管动态申请多少内存,它对象中的一个指针总能找得到你,它指针的大小不会发生改变。也就是说,它所在的结构体变量的大小也是不会改变的!
我也写了一个小程序检查了一下,大家可以通过运行结果看到结构体变量的大小并没有改变!
源程序:
#include <iostream> #include <string> #include <vector> using namespace std; typedef struct Vec { vector<int> int_vec; }Int_vec; typedef struct Str { string str; }Str_string; int main(void) { Int_vec myInt; Str_string myString; cout << "空的 myInt 大小:" << sizeof(myInt) << endl << endl; cout << "空的 myString 大小:" << sizeof(myString) << endl << endl; for (int i = 0; i < 10;i++) { myInt.int_vec.push_back(i); } myString.str = "student"; cout << "有十个元素的 myInt 大小:" << sizeof(myInt) << endl << endl; cout << "有字符串内容的 myString 大小:" << sizeof(myString) << endl << endl; return 0; }
运行截图:
相关文章推荐
- String 对象是不动态改变长度的
- C语言中 不定义结构体变量求成员大小
- 编写程序定义一个vector 对象,其每个元素都是指向string 类型的指针,读 取该vector 对象,输出每个string 的内容及其相应的长度。
- string 作为结构体成员变量之内存泄露
- C语言中 不定义结构体变量求成员大小
- Swift动态获取成员变量及对象关联
- Gson序列化与反序列化成员变量为Map<String,Object>的类对象
- 编写程序从标准输入设备读入的元素数据建立一个int型vector对象,然后动态创建与该vector大小一致的数组,把vector对象的所有元素复制给该数组
- 容器大小的改变以及容器操作可能使迭代器失效、vector对象的容量变化
- 有关C++类中数据成员变量定义的一些想法
- 按钮的基本使用(不能直接访问对象的 结构体属性 的成员变量\)
- 结构体变量及成员作为函数参数
- 从零开始学C++之对象的使用(一):static 成员变量、static 成员函数、类/对象的大小
- 类A的对象作为类B的成员变量
- 对象作为函数参数、类外定义成员函数
- stl中string作为成员变量引起的core问题
- 基本对象Number,String,Array,Math,Date,函数的定义,全局变量
- objective-c运行时机制runtime,动态获取对象的属性和成员变量
- 动态创建一个与该 vector 对象大小一致的数组,把 vector 对象的所有元素复制给新数组_初学vector对象4
- 从零开始学C++之对象的使用(一):static 成员变量、static 成员函数、类/对象的大小