在内存使用或编译时间方面,什么更好? < >这些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 ... }

在内存使用或编译时间方面,什么更好? < >这些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 ... },c++,performance,memory,methods,C++,Performance,Memory,Methods,内存使用或编译时通常有什么区别吗?“内存使用或编译时通常有什么区别吗?” Jarod42绝对正确:“[它]将取决于参数是进入寄存器还是进入堆栈…” 详细说明 假设您的编译器/操作系统使用参数传递约定,其中前N个参数放置在寄存器中,而堆栈上的其他参数(即使使用缓存,速度也会较慢) 如果N至少为1,但小于4,则可以比所有参数更便宜地传递指针(编译器希望能够安排调用者将指针直接加载到同一个寄存器read()将希望它加载,但如果不是,则寄存器到寄存器的复制可以预期为1个周期的操作)。它可以将内存用于寄存

内存使用或编译时通常有什么区别吗?

“内存使用或编译时通常有什么区别吗?”

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

详细说明

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

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

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

如果您真的非常关心内存使用情况,以至于对系统的平衡感兴趣,那么就编译并检查生成的代码



您可以自信地预期,两种接口的编译时间都不会有显著差异。

内存使用是一个问题吗?我推荐后者,因为它简化了函数签名。没有(动态)内存使用,保持简单,只传递两个参数-因此第一个是good@BenjaminBannier:假设
MyClass::read(const-Box&)
MyClass::read(Box)
MyClass::read(Box&)
而OP使用的是
BoxPtr
@Ashalynd Correct。使用引用保存循环(复制对象),而不是
常量
@Ashalynd:对指针的引用可以预期实现与指针的指针类似。。。对于内联代码,通常会对其进行优化,但对于离线的
read()
则意味着在指针允许访问行/列计数器本身之前进行额外的间接读取以获取指针值,这只会降低性能。无论是
const
与否,从性能角度看都无关紧要。
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 ...)