在创建动态数组时,就内存使用和性能而言,以下代码是否被视为“正确”?请解释为什么/为什么不可以。
我的函数getFifoData使用一个指向接收缓冲区的指针,并使用getFifoThreshold在内部基于当前FIFO大小计算消息的持续时间。
int serial_spi_handler::getFifoData(unsigned char * rxBuf) {
uint16_t currentFifoThreshold = getFifoThreshold();
const int msgLength = (currentFifoThreshold * 2) + 1;
std::vector < uint8_t > txBuf;
txBuf.reserve(msgLength);
uint8_t tBuff[txBuf.size()];
tBuff[0] = 0xC2;
int bytesWritten = readWrite(busDescriptor, tBuff, rxBuf, msgLength);
if (consoleLogging) {
printf("getFifoData function, wrote: %d bytes\n\r", bytesWritten);
} else if (diagOutput) {
qDebug() << "getFifoData function, wrote: " << bytesWritten << " bytes";
}
return msgLength;
}
//Header of readWrite:
//int readWrite(int busDescriptor, uint8_t *pTxBuffer, uint8_t *pRxBuffer, int length);
答案 0 :(得分:0)
我不确定您所说的“正确”是什么意思;您的代码至少在@SamVarshavchik提到的意义上是不正确的,编译器会告诉您以下信息:
a.cpp: In function ‘int getFifoData(unsigned char*)’:
a.cpp:20:29: warning: ISO C++ forbids variable length array ‘tBuff’ [-Wvla]
uint8_t tBuff[txBuf.size()];
如果您想了解为什么C ++没有VLA,请阅读以下SO问题:
Why aren't variable-length arrays part of the C++ standard?
我认为您应该考虑一些问题。
readWrite()
-可以读取吗?它写吗?两者都做吗?谁知道。my_buffer
,而不是my_buff
。同样,diagnostic_output
不是diagOutput
。tBuffer
?它是测试缓冲区吗? t 交易缓冲区吗? t 发送缓冲区? t 临时缓冲区吗?getFifoData()
-它甚至可以做什么?它的参数是“ FIFO”吗?这不是参数名称所说的。如果是的话,我们应该从哪里获得这些信息?没有传递使用的目标缓冲区,也没有返回的容器。getFifoData()
占用一个缓冲区而又不占用其长度?span
? std::vector
和可变长度数组都是动态分配的内存。 VLA有其自身的问题(请参见上面的链接),但对于向量来说-您将在此函数的每次调用上执行一个内存分配调用。如果被叫很多,那可能会很昂贵。
打印到控制台或文件很慢。好吧,反正有点慢-这都是相对的。现在,这是在“ if”语句中发生的,但是,如果您已将应用程序配置为记录内容,则每次调用getFifoData()
时都要支付此价格。
最后,-如果您担心性能,可以使用time your function或do it with a profiler。然后,您可以看到实际花费了多少时间以及是否有问题。