一些分配和初始化数组的方法比普通的循环和设置更快[重复]

Posted

技术标签:

【中文标题】一些分配和初始化数组的方法比普通的循环和设置更快[重复]【英文标题】:Some way for allocating and initializing array faster than plain loop-and-set [duplicate] 【发布时间】:2014-08-22 22:06:32 【问题描述】:

这就是我在 C++ 中分配和初始化数组的方式。

char *dataPtr;

dataPtr= new char [40000]; 

int i; 

for(i=0;i<40000;i++)


    dataPtr[i]=200; 

由于 for 循环为我的应用程序花费大量时间,还有其他更快、更清洁的方法吗?

【问题讨论】:

我有理由怀疑这个循环在您的应用程序上占用了任何时间。 我完全同意拉普茨的观点。也许如果您关闭了优化。无论如何,如果你有一些运气,fill_n 或 memset 可能会为你赢得一些额外的时间,但很可能你正在尝试修复一些没有损坏的东西,或者至少,你看错了东西,或者你没有正确测量时间 【参考方案1】:

您可以使用memset(),它的核心是在运行时适当地使用 SSE/SSE2/etc 指令优化汇编。 memset() 函数旨在完成此任务:尽快将 char 数组中的每个 char 设置为特定值。

#include <cstring>

char *dataPtr = new char[LENGTH];
std::memset(dataPtr, 200, LENGTH);

但是,现代编译器会为您执行此操作,您可以检查程序集,并且您可能会在使用 for 循环的原始代码中找到对 memset() 或类似内容的调用。无论如何它只有 40 kB,所以你不会节省太多时间,除非你必须经常初始化数组。

【讨论】:

@hacks:我看不到那个链接的相关性......你能解释一下吗? @quetzalcoatl:C++ 标准将char 定义为一个字节......不管它有多宽。所以保证是有的,但是“字节”的定义不是你习惯的。 哎呀,你是对的。那是未定义宽度的字节,而不是字符,我在匆忙写的时候经常把它们弄错。【参考方案2】:

使用std::vector

std::vector<char> data(40000, 200);

【讨论】:

可能是我做错了什么,但我收到此错误:错误 2 错误 C2040: 'dataPtr' : 'std::vector<_ty>' 在间接级别上与 'char * 不同' 我刚刚在我的代码中添加了这两行:char *dataPtr; std::vector dataPtr(40000, 200); @user2799508 只需#include &lt;vector&gt;std::vector&lt;char&gt; dataPtr(40000, 200); @user:你不需要添加你引用的第一行,char*dataPtr。矢量线可以自己处理。使用 either 数组, 向量。将向量视为类固醇上的超级数组。【参考方案3】:

要通过200初始化每个数组元素,你可以使用

std::fill_n(dataPtr, 40000, 200);

【讨论】:

FWIW, std::fill_n 不会是任何 fast,它也使用循环 @P0W:这取决于编译器。如果std::fillstd::fill_n 的参数是指向char 的指针,我知道MSVC++ 将使用memset()

以上是关于一些分配和初始化数组的方法比普通的循环和设置更快[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用循环从数组的开始迭代到结束比迭代开始到结束和结束到开始更快?

比较列表理解和显式循环(3 个数组生成器比 1 个 for 循环更快)

有没有更快的方法来添加数组? [关闭]

为啥处理排序数组比处理未排序数组更快?

什么是更快的嵌套循环或多个循环? [关闭]

[PHP] PHP7比PHP5数组优化的点