C++ 动态连续阵列
用C++11制作一个1D动态连续数组有什么方法吗 我将通过C++ 动态连续阵列,c++,c,arrays,dynamic,malloc,C++,C,Arrays,Dynamic,Malloc,用C++11制作一个1D动态连续数组有什么方法吗 我将通过stdin获取数组的大小,一旦创建了它,就不需要调整大小 现在我使用的是枚举的一维向量,我最大的性能问题是向量[]操作符 如果不能在C++中完成,我将用 MalOC 和C来做它的方法,请注意 >删除>代码> > 编辑:没有意识到矢量是日夜调试和发布的。我用-O3重新运行callgrind,现在的问题是ostream而不是vectors——感谢所有人让我在不需要时使用数组重写它之前对自己进行了二次猜测。在C中,您可以使用 int *ptr
stdin
获取数组的大小,一旦创建了它,就不需要调整大小
现在我使用的是枚举的一维向量,我最大的性能问题是向量[]操作符
如果不能在C++中完成,我将用<代码> MalOC 和C来做它的方法,请注意<代码> >删除>代码> >
编辑:没有意识到矢量是日夜调试和发布的。我用-O3重新运行callgrind,现在的问题是ostream而不是vectors——感谢所有人让我在不需要时使用数组重写它之前对自己进行了二次猜测。在C中,您可以使用
int *ptr=NULL;
int num_elements = 0;
printf("how many elements?\n");
if(scanf("%d", &num_elements)==1) {
ptr = malloc(sizeof(int)*num_elements);
if(ptr == NULL) {
printf("unable to allocate %d elements\n", num_elements);
exit 0;
}
}
当你完成后,你会打电话
free(ptr);
确保你只打一次电话!有些人会的
if( ptr != NULL ) {
free(ptr);
ptr = NULL;
}
作为防御性编码—防止意外释放它两次。您始终可以使用new运算符从堆中动态创建特定类型的连续同质存储
Type *pType = new Type[size](initial_value)
要删除存储,需要显式调用数组删除运算符
delete[] pType
但是,当你说,
时,我最大的性能问题是vector[]操作符。
,我怀疑。您是否分析了代码的零售版本?您如何知道向量下标是您的性能瓶颈 > P>如果使用C++,使用<代码> MalOC 可能是一个很差(下级)的想法。
然后删除,
delete[] MyType;
std::vector
具有足够的性能,可用于生产。它用于解决编程竞赛中的问题。也许,你忘了编译成发行版
此外,您还可以使用new
和delete
运算符
要释放分配的内存,请使用free(void*ptr)
函数。int size=10;
int size = 10;
std::unique_ptr<int[]> a(new int[size]);
std::unique_ptr a(新整数[size]);
跟随RAII(即数组是自毁的)
然而,我认为向量[]操作符不应该是性能问题。在调试编译中,可以对其进行检查,但在发行版中不应进行检查。
在MSVC中,有一个称为检查迭代器的特性,它可能会“杀死”性能。但是,您可以关闭此功能(只需通过谷歌搜索即可)对向量的操作通常不会比数组中的索引更昂贵。您使用的问题是
枚举
?为什么不使用常规整数?我使用枚举是为了可读性,它是一个1字节的枚举,我对它进行逐位运算。+1“我怀疑。您是否分析了代码的零售版本?”if块是不必要的-释放空指针完全可以。@AndreasGrapentin see-“情况并非总是如此”。我记得在释放NULL时遇到了崩溃(可能是90年代初PC上的Borland C)。我怀疑“在免费(空)
上不做任何事”的标准并不总是存在。你链接的问题中的公认答案似乎支持我的观点:)@andreas-是的。但更进一步,还有其他观察结果……我们都有一个观点,但你对标准的看法绝对正确。
int size = 10;
std::unique_ptr<int[]> a(new int[size]);