我知道在C++中无法获得动态创建的数组的大小,例如:
int* a;
a = new int[n];
我想知道的是:为什么?人们只是在C++的规范中忘记了这一点,还是有技术原因呢?
信息不是存储在某个地方吗?毕竟,命令
delete[] a;
似乎知道它需要释放多少内存,所以在我看来,delete[]
有某种方法可以知道a
的大小。
发布于 2016-04-08 04:50:16
您通常会发现,内存管理器只会分配特定倍数的空间,例如64字节。
因此,您可以请求新的int4,即16字节,但是内存管理器将为您的请求分配64字节。要释放这个内存,它不需要知道您请求了多少内存,只需要知道它已经为您分配了一个64字节的块。
下一个问题可能是,它可以不存储请求的大小吗?这是一个额外的开销,并不是每个人都愿意支付。例如,Arduino Uno仅具有2k的RAM,并且在该上下文中,用于每次分配的4字节突然变得重要。
如果您需要该功能,那么您可以使用std::vector (或等效的),或者您可以使用更高级的语言。C/C++的设计目的是使您能够以尽可能少的开销工作,这是一个例子。
发布于 2016-04-07 17:48:22
一个基本原因是,指向动态分配的T
数组的第一个元素的指针和指向任何其他T
的指针没有区别。
考虑一个虚构的函数,它返回指针所指向的元素的数量。
让我们称它为"size“。
听起来很不错,对吧?
如果不是因为所有的指针都是平等的:
char* p = new char[10];
size_t ps = size(p+1); // What?
char a[10] = {0};
size_t as = size(a); // Hmm...
size_t bs = size(a + 1); // Wut?
char i = 0;
size_t is = size(&i); // OK?
您可能会争辩说,第一个大小应该是大小,第二个大小应该是10
,第三个大小应该是9
,最后一个大小应该是1
,但要实现这一点,您需要在每个对象上添加一个“1
标签”。
在64位机器上,char
将需要128位的存储空间(因为需要对齐)。这是必要的16倍。
(上面,10个字符的数组a
至少需要168个字节。)
这可能是方便的,但它也是不可接受的昂贵。
当然,您可以设想只有当参数确实是指向默认operator new
动态分配的第一个元素的指针时,才会有一个定义良好的版本,但这并不像人们想象的那么有用。
发布于 2016-04-07 20:22:23
你说得对,系统的某些部分必须知道一些关于大小的信息。但是,内存管理系统(比如malloc
/free
)的应用编程接口可能不包括获取这些信息,并且您请求的确切大小可能不知道,因为它可能已经四舍五入了。
https://stackoverflow.com/questions/36471101
复制相似问题