我是C++的新手,我有以下代码:
struct Airline {
string Name;
int diameter;
int weight;
};
Airline* myPlane = new Airline;
我的问题是,当我调用new
方法时,它会分配内存,如果我没记错的话。特别是考虑到其中有一个字符串类型,PC如何知道要分配多少内存?
谢谢
我是C++的新手,我有以下代码:
struct Airline {
string Name;
int diameter;
int weight;
};
Airline* myPlane = new Airline;
我的问题是,当我调用new
方法时,它会分配内存,如果我没记错的话。特别是考虑到其中有一个字符串类型,PC如何知道要分配多少内存?
谢谢
std::string
是固定大小的对象;它包含一个指向实际字符缓冲区及其长度的指针。 std::string
的定义看起来像是这样的:
class string
{
char *buffer;
size_t nchars;
public:
// interface
};
这意味着您的Airline
对象也具有固定的大小。
new
不仅分配内存,还初始化对象,包括std::string
,这意味着它可能会将char
指针设置为0
,因为空串。
您还可以使用 sizeof
来获取结构的大小:
cout << "sizeof(Airline) = " << sizeof(Airline) << endl;
string
对象也没有什么不同。它实际上是标准库中的一个类,而不是像 int
或 float
这样由编译器处理的特殊类型。就像您的结构一样,string
类包含编译器知道大小的字段,因此它知道完整结构的大小,并在使用 new
时使用该大小。new
函数将分配sizeof(Airline)
所需的空间来存储一个类型为Airline
的对象。
对于字符串的管理,string
对象保存一些内部数据以管理实际数据存储的内存,但不包括数据本身(除非使用小对象优化)。虽然其他人指出了类似“存储指向实际字符串的指针”的想法,但这并不够精确,因为实现还会存储该指针加上额外的数据,例如size()
和capacity()
(在引用计数实现中还有引用计数等其他数据)。
字符串的内存可能在类string
内,也可能不在。很可能(甚至很大概率),类string
会管理自己的内存,只需使用指向存储数据所用内存的指针即可。例如:
struct Airlane {
String Name {
char *data; // size = 4
size_t size; // size = 4
}
int diameter; // size = 4
int weight; // size = 4
}; // size = 16
Airline* myPlane = new Airline {
Name = {
data = new char[some-size]
...
}
...
}
内部分配由持有构造函数完成:
Airline::Airline() : string(), ... {}
string::string () : data(new char[...] ... {}
operator new
除了分配一些固定大小的内存作为Airline
的"土壤"(见第一个p-code)之外,什么也不做,然后通过调用字符串构造函数(隐式或显式地),“种植”Airline
的构造函数,该构造函数本身必须在那个受限制的“土壤”容量中管理其生存期,这样它就会进行另一个new
。
当你分配Airline
时,new
会在堆上分配足够的空间来存储两个整数、string
及其字段。
string
在堆栈上的大小始终相同。但在内部,string
存储指向字符数组的指针。