C++使用单个值填充空缓冲区
C++ fill an empty buffer with a single value
如果我使用了不正确的术语,我会提前道歉,我是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)
- C++:使用缓冲区中的数据填充结构
- 深度缓冲区未填充阴影贴图渲染通道中的数据
- 缓冲区填充了不同类型的数据和严格的混叠
- DirectX11只绘制填充索引和顶点缓冲区中的一半顶点
- 填充和保存线程之间的共享缓冲区
- strcpy_s将超过字符串长度的字符串复制到目标缓冲区(用 0xFE 填充)
- 缓冲区用不需要的数据填充 char 数组中的最后一个空格
- InternetReadFile 填充缓冲区,但返回零字节读取
- 无法使用两种不同的频率填充 *.wav 文件的缓冲区
- P/调用C++用于填充托管缓冲区的 DLL
- 是否存在以相反顺序填充缓冲区的MEMSET函数
- FFMPEG挂在缓冲区填充C 上
- 在 C++ 中填充重复的自定义协议缓冲区字段
- C - 分配一个未签名的炭缓冲区,然后用字符串填充
- C/C++ 从字符缓冲区读取以填充结构
- 如果缓冲区由数据流填充,则 C++ boost async_read_some被缓冲区阻止
- 将额外的字节填充到要通过网络发送的flatbuffer的缓冲区指针
- 在本地将数据填充到recv缓冲区中
- 在 c++ 中使用消息结构读取/填充数据缓冲区的正确方法是什么?
- 从流和缓冲区填充矢量时会产生不同的结果