[英]Pointer to an array get size C++
int * a;
a = new int[10];
cout << sizeof(a)/sizeof(int);
如果我使用普通数组,答案将是10 ,a,幸运数字是1 ,因为sizeof(int)是4,iszeof(* int)也是4。 我该如何推荐? 就我而言,在内存中保留大小是一个复杂的选择。 如何使用代码获取尺寸?
我最好的猜测是遍历数组并搜索其结尾,结尾为0,对吗? 有什么建议么?
- 编辑
好吧,我担心向量是它会在回推的同时重新分配,这很重要,我可以判断是否分配了内存。 但是我无法更改结构,所以整个代码都是相对的。 感谢您的回答,我发现没有办法了,所以请寻找一种将大小存储在内存中的方法。
我问什么,不是要使用哪种结构。
简单。
使用std::vector<int>
或std::array<int, N>
(其中N
是编译时常量)。
如果您知道在编译时数组的大小,并且不需要在运行时进行扩展,请使用std::array
。 否则使用std::vector
。
这些被称为序列容器类,它们定义了一个称为size()
的成员函数,该函数返回容器中元素的数量。 您可以在需要知道尺寸时使用它。 :-)
阅读文档:
当您使用std::vector
,如果您对容器将要容纳的元素数量有一些模糊的想法,则应考虑使用reserve()
。 这将为您带来性能优势。
如果您担心std::vector
和raw-arrays的性能 ,请在此处阅读公认的答案:
它解释了为什么问题中的代码很慢,这与std::vector
本身无关 ,而与它的错误用法无关 。
如果您不能使用它们中的任何一个,而被迫使用int*
,那么我建议这两种选择。 选择适合您需要的任何东西。
struct array
{
int *elements; //elements
size_t size; //number of elements
};
这是不言自明的。
第二个是这样:为另一个元素分配内存,并将大小存储在第一个元素中,如下所示:
int N = howManyElements();
int *array = int new[N+1]; //allocate memory for size storage also!
array[0] = N; //store N in the first element!
//your code : iterate i=1 to i<=N
//must delete it once done
delete []array;
sizeof(a)
将是指针的大小,而不是分配的数组的大小。
分配数组后,无法获取数组的大小。 sizeof
运算符必须能够在编译时进行评估。
编译器如何知道此函数中的数组有多大?
void foo(int size)
{
int * a;
a = new int[size];
cout << sizeof(a)/sizeof(int);
delete[] a;
}
不能。 因此sizeof
运算符不可能返回分配的数组的大小。 而且,实际上,没有可靠的方法来获取使用new
分配的数组的大小。 让我重复一遍,没有可靠的方法来获取使用new
分配的数组的大小 。 您必须将大小存储在某个地方。
幸运的是,这个问题已经为您解决,并且可以保证在任何C ++实现中都存在。 如果您想要一个很好的数组来存储大小和数组,请使用::std::vector
。 特别是如果您使用new
来分配数组。
#include <vector>
void foo(int size)
{
::std::vector<int> a(size);
cout << a.size();
}
妳去 请注意,您不再需要记住将其删除。 还要注意的是,以这种方式使用::std::vector
不会比以您原来的方式使用new
性能损失。
如果您不能像您所说的那样使用std :: vector和std :: array,那么唯一的保留方法是自己跟踪数组的大小。
我仍然怀疑您避免std :: vector的原因被误导了。 即使对于性能监控软件,矢量的智能使用也是合理的。 如果您担心调整大小,则可以将向量预分配为适当的大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.