假设我有一个重复数百万次的循环.在这个循环里面我有一个函数调用.
在这个函数的内部,我需要在一开始就创建一些临时变量.现在,哪一个更好:
a)在代码开头创建临时变量,在循环开始时初始化变量,并将其作为参数传递
b)在被调用函数的开头创建刚刚的本地临时变量?
这是一个问题吗?我想知道哪一点被认为是更好的做法,哪一个更快.
解决方法
我们为some_function()抛出一些可能的定义,这个函数将从你的循环中调用.
// Method 1 void some_function() { int temporary; // Use temporary } // Method 2 void some_function(int temporary) { // Use temporary } // Method 3 void some_function(int *temporary) { // Use *temporary }
方法1可能是这些选项中最可读的,所以这是我喜欢的,除非你有一个很好的理由去做别的事情.除了您的编译器正在调用函数之外,它还可能比其他任何一个都要快.如果是这样,那么所有三个都可能执行完全相同(如果编译器无法优化远程指针取消引用,方法3可能会更慢).
如果编译器没有内联,那么方法2可能比方法1慢.这是因为在堆栈分配的内存方面,它们是相同的 – 函数参数将以相同的方式存储在堆栈中当地人在这个上下文中,函数参数和本地的唯一区别是函数参数可以被调用者赋予一个值.将调用者的值传递给函数的这一步(理论上讲)会减慢调用速度.
方法3几乎肯定会变慢,因为对临时内存的访问将包含间接级别.与访问本地时相比,引用一个指针不是一个便宜的操作.
当然,如果表现绝对关键,那么你应该对这些方法进行基准测试.我怀疑方法1将变成最快(或至少不比其他的慢),并且另外似乎对我更可读.