如果我使用的是不正确的术语,我会提前道歉,我是C ++语言的新手。我有一个带有构造函数的类,它使用malloc
LPD6803PWM::LPD6803PWM(uint16_t leds, uint8_t dout, uint8_t cout) {
numLEDs = leds;
pixels = (uint16_t *) malloc(numLEDs);
dataPin = dout;
clockPin = cout;
}
我的理解是,这会创建一个空缓冲区,其长度为传递给numLEDs
的任何内容,这实际上是动态创建的数组正确吗?我正在使用malloc
,因为这个代码在一个内存非常有限的Arduino上运行,我想避免溢出,而且从我读过的内容来看,这是声明数组的最佳方法,你不知道它的大小数组将是,你想避免溢出错误。
我的问题是,一旦创建了这个数组,就会有比传统for循环更快的方法来用一个值填充数组。我经常会想要这样做,甚至微秒也会在这个应用程序中产生影响。我知道从C ++标准库中,数组类有一个fill
方法,但是以这种方式声明的数组呢?
答案 0 :(得分:2)
我的问题是,一旦创建了这个数组,就会有比传统的for循环更快的方法来用一个值填充数组。
C标准库提供memset()
和相关函数来填充缓冲区。还有calloc()
,它像malloc()
一样分配缓冲区,但同时用0
填充缓冲区。
我经常想要这样做,甚至微秒也会对这个应用产生影响。
在这种情况下,您可能会考虑避免重复分配数组的方法,这可能比填充现有数组花费更多时间。同样,使代码更快的最简单方法是在更快的硬件上运行它。 Arduino是一个很棒的平台,但是Raspberry Pi Zero的成本更低(5美元,如果你能找到的话),拥有更多的内存,并且其时钟速度比典型的Arduino(1Ghz vs. 16MHz)快64倍。计算通常是良好,廉价和快速之间的权衡,但在这种情况下,你得到所有三个。
答案 1 :(得分:1)
您仍然可以使用std::fill
(或std::fill_n
),大多数标准库实现都会委托给memset
进行RandomAccessIterator(例如gcc和Clang)。相信标准的图书馆作家!
答案 2 :(得分:0)
您可以使用memset。但是你必须要小心你想要设置的值。而且使用for
循环并不会快得多。计算机需要以某种方式设置所有这些值! memset
可能会设置更大的连续内存跨度,因此速度更快,但智能编译器可能会对for
循环执行相同的操作。
如果您真的关心微秒,则需要进行一些分析。
答案 3 :(得分:0)
好吧,你可以使用stdlib.h中的memset:
memset(array, 0, size_of_array_in_bytes);
但请注意,memset逐字节工作,例如它将第一个字节设置为0或将您设置的任何值设置为第二个参数,然后设置第二个字节,依此类推,这意味着您必须小心。
请注意: malloc将其大小作为数组的大小(以字节为单位),因此您可以考虑将其参数乘以sizeof(uint16_t)