成员变量与函数参数
Member Variable vs. Function Argument
我试图弄清楚是否给函数一个参数或简单地使用成员变量更快。我有以下代码:
class Variable
{
private:
public:
Variable() {}
~Variable() {}
struct
{
static const int test = 3;
}testVar;
};
class VariableTransmit
{
private:
Variable var;
public:
VariableTransmit() {}
~VariableTransmit() {}
void testFunc1(int test)
{
int foo = 2;
foo = test;
}
void testFunc2()
{
int foo = 2;
foo = var.testVar.test;
}
};
struct
{
static const int test = 3;
}extVar;
int main(void)
{
VariableTransmit transmit;
clock_t prgstart, prgend;
prgstart = clock();
for(int i = 0; i <= 10000000; i++)
{
transmit.testFunc1(extVar.test);
}
prgend = clock();
printf("delivered: %.5f secondsnn", (float)(prgend - prgstart) / CLOCKS_PER_SEC);
prgstart = clock();
for(int i = 0; i <= 10000000; i++)
{
transmit.testFunc2();
}
prgend = clock();
printf("member: %.5f secondsnn", (float)(prgend - prgstart) / CLOCKS_PER_SEC);
return 0;
}
我测试了这段代码,令我惊讶的是testFunc1和testFunc2具有相同的处理速度。我曾认为testFunc1将是更快的一个,因为它从结构体中获取值作为参数,只需要设置它,而testFunc2必须访问var对象,然后从对象内部的结构体中获取值。是这个编译器特定的优化(我使用VS2010 btw.)还是我只是忽略了一些东西?
编辑:删除了第二个基于意见的问题。
您的示例将由visual c++编译器高度优化。testFunc1
甚至可能更慢,这取决于用于传递test
的寄存器,而testFunc2
总是从复制相同的虚拟地址。
为什么?您的Variable var
在堆栈上创建。它将在对象创建时创建,因此编译器可以预测它的虚拟地址。(您可以在堆上创建Variable
对象,这样执行时间会稍微长一些。)
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类