gpt4 book ai didi

c++ - 以编程方式确定 C++ 数组的大小?

转载 作者:IT老高 更新时间:2023-10-28 13:21:26 26 4
gpt4 key购买 nike

这个问题的灵感来自一个类似的问题:How does delete[] “know” the size of the operand array?

我的问题有点不同:有没有办法以编程方式确定 C++ 数组的大小?如果不是,为什么?我见过的每个接受数组的函数也需要一个整数参数来指定它的大小。但是正如链接的问题所指出的那样, delete[] 必须知道要释放的内存大小。

考虑一下这个 C++ 代码:

int* arr = new int[256];
printf("Size of arr: %d\n", sizeof(arr));

这将打印“Size of arr: 4”,这只是指针的大小。有一些打印 256 的函数会很好,但我认为 C++ 中不存在这样的函数。 (同样,问题的一部分是为什么它不存在。)

澄清:我知道如果我在堆栈而不是堆上声明数组(即“int arr[256];”), sizeof 运算符将返回 1024(数组长度 * sizeof(int))。

最佳答案

delete [] 确实知道分配的大小。但是,该知识存在于运行时或操作系统的内存管理器中,这意味着编译器在编译期间无法使用它。并且 sizeof() 不是一个真正的函数,它实际上是由编译器评估为一个常量,这对于动态分配的数组是无法做到的,其大小在编译期间是未知的。

另外,考虑这个例子:


int *arr = new int[256];
int *p = &arr[100];
printf("Size: %d\n", sizeof(p));

编译器如何知道 p 的大小是多少?问题的根源在于 C 和 C++ 中的数组不是一流的对象。它们衰减为指针,编译器或程序本身无法知道指针是指向由 new 分配的内存块的开头,还是指向单个对象,还是指向new 分配的内存块中间的某个位置。

其中一个原因是 C 和 C++ 将内存管理留给程序员和操作系统,这也是它们没有垃圾收集的原因。 newdelete 的实现不是 C++ 标准的一部分,因为 C++ 旨在用于各种平台,这些平台可能以非常不同的方式管理它们的内存。如果您正在为在最新 Intel CPU 上运行的 windows 机器编写文字处理器,则可能让 C++ 跟踪所有分配的数组及其大小,但是当您编写运行在DSP。

关于c++ - 以编程方式确定 C++ 数组的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/197839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com