在C ++中正确使用具有动态数组长度的内存

时间:2018-12-07 17:21:03

标签: c++ arrays memory-management dynamic-arrays

在创建动态数组时,就内存使用和性能而言,以下代码是否被视为“正确”?请解释为什么/为什么不可以。

我的函数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);

1 个答案:

答案 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 临时缓冲区吗?
  • 并非所有人都知道RX的含义。
  • getFifoData()-它甚至可以做什么?它的参数是“ FIFO”吗?这不是参数名称所说的。如果是的话,我们应该从哪里获得这些信息?没有传递使用的目标缓冲区,也没有返回的容器。

缓冲区溢出/无效的内存访问机会

  • 为什么getFifoData()占用一个缓冲区而又不占用其长度?
  • 更好的是,为什么不花span

使用动态分配的缓冲区

std::vector和可变长度数组都是动态分配的内存。 VLA有其自身的问题(请参见上面的链接),但对于向量来说-您将在此函数的每次调用上执行一个内存分配调用。如果被叫很多,那可能会很昂贵。

记录

打印到控制台或文件很慢。好吧,反正有点慢-这​​都是相对的。现在,这是在“ if”语句中发生的,但是,如果您已将应用程序配置为记录内容,则每次调用getFifoData()时都要支付此价格。

计时!

最后,-如果您担心性能,可以使用time your functiondo it with a profiler。然后,您可以看到实际花费了多少时间以及是否有问题。