C++;用单个值填充空缓冲区 如果我用的是不正确的术语,我会先道歉,我是C++语言的新手。我有一个带有构造函数的类,它使用malloc LPD6803PWM::LPD6803PWM(uint16_t leds, uint8_t dout, uint8_t cout) { numLEDs = leds; pixels = (uint16_t *) malloc(numLEDs); dataPin = dout; clockPin = cout; }

C++;用单个值填充空缓冲区 如果我用的是不正确的术语,我会先道歉,我是C++语言的新手。我有一个带有构造函数的类,它使用malloc LPD6803PWM::LPD6803PWM(uint16_t leds, uint8_t dout, uint8_t cout) { numLEDs = leds; pixels = (uint16_t *) malloc(numLEDs); dataPin = dout; clockPin = cout; },c++,arrays,C++,Arrays,我的理解是,这将创建一个空缓冲区,其长度与我传递给numLEDs的长度相同,这本质上是一个动态创建的数组,对吗?我使用的是malloc,因为这段代码使用的是内存非常有限的Arduino,我希望避免溢出。根据我所读的内容,这是声明数组的最佳方法,因为您不知道数组的大小,并且希望避免溢出错误 我的问题是,一旦创建了这个数组,是否有比传统的for循环更快的方法用单个值填充数组。我经常想这样做,甚至微秒在这个应用程序中也会有所不同。我知道,从C++标准库中,数组类有一个填充方法,但是这样声明的数组如何?

我的理解是,这将创建一个空缓冲区,其长度与我传递给
numLEDs
的长度相同,这本质上是一个动态创建的数组,对吗?我使用的是
malloc
,因为这段代码使用的是内存非常有限的Arduino,我希望避免溢出。根据我所读的内容,这是声明数组的最佳方法,因为您不知道数组的大小,并且希望避免溢出错误

我的问题是,一旦创建了这个数组,是否有比传统的for循环更快的方法用单个值填充数组。我经常想这样做,甚至微秒在这个应用程序中也会有所不同。我知道,从C++标准库中,数组类有一个<代码>填充<代码>方法,但是这样声明的数组如何?

我的问题是,一旦创建了这个数组,是否有比传统的for循环更快的方法用单个值填充数组

C标准库提供了用于填充缓冲区的
memset()
和相关函数。还有
calloc()
,它像
malloc()
一样分配缓冲区,但同时用
0
填充缓冲区

我经常想这样做,甚至微秒在这个应用程序中也会有所不同

在这种情况下,您可能会考虑避免重复分配数组的方法,这可能比占用现有数组花费更多的时间。同样,让代码运行得更快的最简单方法是在更快的硬件上运行它。Arduino是一个很棒的平台,但是Raspberry Pi Zero的成本更低(如果你能找到的话,5美元),内存更多,时钟速度比典型的Arduino快64倍(1Ghz比16MHz)。计算通常是好的、便宜的和快速的三者之间的折衷,但在这种情况下,你得到了这三者

我的问题是,一旦创建了这个数组,是否有比传统的for循环更快的方法用单个值填充数组

C标准库提供了用于填充缓冲区的
memset()
和相关函数。还有
calloc()
,它像
malloc()
一样分配缓冲区,但同时用
0
填充缓冲区

我经常想这样做,甚至微秒在这个应用程序中也会有所不同

在这种情况下,您可能会考虑避免重复分配数组的方法,这可能比占用现有数组花费更多的时间。同样,让代码运行得更快的最简单方法是在更快的硬件上运行它。Arduino是一个很棒的平台,但是Raspberry Pi Zero的成本更低(如果你能找到的话,5美元),内存更多,时钟速度比典型的Arduino快64倍(1Ghz比16MHz)。计算通常是好、便宜和快速之间的折衷,但在这种情况下,您可以同时获得这三种功能。

您可以使用。但是你必须小心你想要设定的值。而且您不会比使用
for
循环快多少。计算机需要以某种方式设置所有这些值
memset
可以设置更大的连续内存跨度,因此速度更快,但是智能编译器可以对
for
循环执行相同的操作

如果你真的关心微秒,你需要做一些分析。

你可以使用。但是你必须小心你想要设定的值。而且您不会比使用
for
循环快多少。计算机需要以某种方式设置所有这些值
memset
可以设置更大的连续内存跨度,因此速度更快,但是智能编译器可以对
for
循环执行相同的操作


如果你真的关心微秒,你需要做一些分析。

那么,你可以使用stdlib.h中的memset:

memset(array, 0, size_of_array_in_bytes);
但是请注意,memset是逐字节工作的,例如,它将第一个字节设置为0或将任何值设置为第二个参数,然后设置第二个字节,以此类推,这意味着您必须小心

请注意:
Maloc的大小是数组大小的字节,因此您可以考虑将其参数乘以siZeof(UTI1616T)

,您可以使用来自STDLIB的MEMSET。

memset(array, 0, size_of_array_in_bytes);
但是请注意,memset是逐字节工作的,例如,它将第一个字节设置为0或将任何值设置为第二个参数,然后设置第二个字节,以此类推,这意味着您必须小心

请注意:
Maloc的大小是数组大小,以字节为单位,因此您可以考虑将参数乘以siZeof(UTI1616T)

< p>您仍然可以使用<代码> STD::填充< /代码>(或<代码> STD::FILILN ),大多数标准库实现将委托给RandomAccessIterator(例如GCC和Clang)的<代码> MyStase<代码>。相信标准图书馆的作者

您仍然可以使用
std::fill
(或
std::fill\n
),对于RandomAccessIterator,大多数标准库实现将委托给
memset
(例如gcc和Clang)。相信标准图书馆的作者

基本的
memset
实现比
for
慢,因为它只对单个字节进行操作。然而,这是相当少见的,因为它是一个非常容易优化的函数,并且比
for
@black的
快十分之一倍(甚至数百倍)。一个好的编译器对于一个具有常量赋值的循环应该会得到相同的结果。我感兴趣的是,哪种优化能使处理器更快地设置内存位置?有很多话要说(问问你是否需要!)。基本上,现代CPU可以像处理单个操作(SIMD)一样处理大块字节(128、256、512)。此外,如果检测到这些大型存储是并行的,它们可以并行/无序地计算它们(称为ILP指令级并行)