【问题标题】:What is better in terms of memory usage or compile time?在内存使用或编译时间方面哪个更好?
【发布时间】:2014-02-05 11:04:50
【问题描述】:

在内存使用方面,这些 C++ 方法中哪一个更好?有什么区别吗?

std::string MyClass::read ( std::size_t startRow, std::size_t startCol, std::size_t endRow, std::size_t endCol )
{
  std::size_t currentRow = startRow;
  std::size_t currentCol = startCol;
  while(currentRow < endLine ...)
    ......
  }
  return ...
}

或相同:

std::string MyClass::read (BoxPtr boxPointer)
{
   std::size_t currentRow = boxPointer->getFirstRow;
   std::size_t currentCol = boxPointer->getFirstCol;

   while(currentRow < boxPointer->getEndRow ...)
   {
     ......
   }
}

显然需要这些:

std::string str = read(boxPointer);
std::string str = read(boxPointer->getFirstRow, boxPointer->getFirstCol ...)

一般来说内存使用或编译时间有什么不同吗?

【问题讨论】:

  • 内存使用有问题吗?我会推荐后者,因为它简化了函数签名。
  • 没有(动态)内存使用,保持简单,只需传递两个参数 - 因此第一个很好
  • @BenjaminBannier:假设MyClass::read(const Box&amp;)MyClass::read(Box)MyClass::read(Box&amp;&amp;) 而OP 使用BoxPtr
  • @Ashalynd 正确。使用引用保存循环(对象的复制),而不是 const
  • @Ashalynd:可以预期对指针的引用与指向指针的指针类似地实现...对于内联代码,它通常会被优化掉,但对于外联 @ 987654329@ 这意味着在指针允许访问行/列计数器本身之前,需要额外的间接读取来获取指针值——这只会降低性能。是否为const 与性能无关。

标签: c++ performance memory methods


【解决方案1】:

“一般来说内存使用或编译时间有什么不同吗?”

Jarod42 绝对正确:“[它] 取决于参数是进入寄存器还是堆栈......”

详细说明...

假设您的编译器/操作系统使用参数传递约定,其中前 N 个参数放在寄存器中,其他参数放在堆栈中(即使使用缓存也会变慢)。

如果 N 至少为 1,但小于 4,那么您可以比所有参数更便宜地传递指针(编译器有望设法安排调用者将指针直接加载到同一寄存器 @987654321 @ 会想要它,但如果不是寄存器到寄存器的副本,则可以预期是 1 周期操作)。它可以将内存用于寄存器复制机器代码,但没有堆栈内存或机器操作码用于推送或弹出。

如果 N 为 4 或更多(非常可能),那么堆栈内存使用情况与使用哪个接口无关,但确切的机器代码可能是一个比另一个更冗长...您的代码假定调用者中已经存在boxPointer,因此传递它总是很便宜,并且不需要或使用最少的机器代码来确保它在预期的寄存器中。如果所有四个参数都必须在特定寄存器中传递,则可能涉及更多调用方机器代码。与此相反,read() 中通过指针获取四个值的机器代码在某些 CPU 上可能会大几个字节。拥有一个更大的函数通常比调用它需要更多的调用方代码更好,因为可以有更多的调用站点。

如果您真的很在意内存使用情况以对系统平衡感兴趣,那么请编译并检查您生成的代码。


您可以放心地期望使用任一接口的编译时间没有显着差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2021-02-19
    • 2018-11-05
    • 2016-11-08
    • 1970-01-01
    • 2014-03-24
    • 2018-04-14
    相关资源
    最近更新 更多