在内存使用方面,哪些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 ...)
通常在内存使用情况或编译时间有任何差异吗?
"一般而言,内存使用情况或编译时间有任何差异吗?"
JAROD42绝对正确:" [它]将取决于参数是否在寄存器中或堆栈中..."
详细说明...
说您的编译器/OS使用一个通过参数传递约定,其中第一个N参数放在寄存器中,并在堆栈上放置其他参数(即使使用缓存也会较慢)。
如果n至少1,但少于4,则您可以比所有参数更便宜地通过指针(编译器将有望设法安排呼叫者将指针直接加载到同一寄存器read()
中想要它,但是如果不是寄存器,则可以预期是1周期的操作)。它可能使用内存来用于寄存器复制机器代码,但没有用于推或弹出的堆栈内存或计算机操作编码。
如果n是四个或多个(非常),那么使用哪个接口使用哪个接口没有区别,尽管再次确切的机器代码可能是一个比另一个的详细信息更多...您的代码评估boxPointer
已经存在于呼叫者中,因此通过它并不使用它或最少的机器代码来确保其在预期的寄存器中总是很便宜的。如果所有四个参数必须以特定的寄存器传递,则可能涉及更多呼叫者端机器代码。反对这一点,read()
内的机器代码通过指针进入四个值可能会在某些CPU上更大。通常,具有更大的功能比呼叫者端代码要好,因为可能还有更多的呼叫站点。
如果您真的很关心内存使用量以使您对系统的余额感兴趣,请编译并检查生成的代码。
您可以自信地期望与任何接口之间的编译时间没有显着差异。