C++使用单个值填充空缓冲区

C++ fill an empty buffer with a single value

本文关键字:缓冲区 填充 单个值 C++      更新时间:2023-10-16

如果我使用了不正确的术语,我会提前道歉,我是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方法,但用这种方式声明的数组呢?

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

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

我经常想这样做,甚至微秒也会对这个应用程序产生影响。

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

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

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

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

好吧,您可以使用stdlib.h:中的memset

memset(array, 0, size_of_array_in_bytes);

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

只是一个提示:malloc的大小是以字节为单位的数组大小,因此您可以考虑将其参数乘以sizeof(uint16_t)