在内存使用或编译时间方面有什么好处?

时间:2014-02-05 11:04:51

标签: c++ performance memory methods

哪种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 ...)

内存使用情况或编译时间是否存在任何差异?

1 个答案:

答案 0 :(得分:2)

“通常在内存使用方面或编译时有什么不同吗?”

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

阐述......

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

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

如果N为4或更多(可能 非常 ),那么使用哪个接口的堆栈内存使用没有区别,尽管确切的机器代码可能是一个比另一个更冗长...你的代码在调用者中已经存在read(),因此传递它并且不需要任何或最小的机器代码以确保它在预期的寄存器中总是很便宜。如果必须在特定寄存器中传递所有四个参数,则可能涉及更多的调用方端机器代码。反驳说,boxPointer内的机器代码通过指针获得四个值,在某些CPU上可能会增加几个字节。具有更大的功能通常比调用它所需的更多调用方代码更好,因为可以有更多的调用站点。

如果您真的非常关心内存使用情况,而对系统上的余额感兴趣,那么请编译并检查生成的代码。


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