成员变量与函数参数

Member Variable vs. Function Argument

本文关键字:参数 函数 变量 成员      更新时间:2023-10-16

我试图弄清楚是否给函数一个参数或简单地使用成员变量更快。我有以下代码:

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对象,这样执行时间会稍微长一些。)

关于公共/私人的事情:通常,你可以随心所欲。我个人认为,在多线程环境中,将类的内部结构公开会增加意外竞争条件的风险。[/p>