成员变量与函数参数

时间:2015-08-19 12:53:03

标签: c++ visual-studio-2010 struct

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

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 seconds\n\n", (float)(prgend - prgstart) / CLOCKS_PER_SEC);

    prgstart = clock();

    for(int i = 0; i <= 10000000; i++)
    {
        transmit.testFunc2();
    }

    prgend = clock();
    printf("member: %.5f seconds\n\n", (float)(prgend - prgstart) / CLOCKS_PER_SEC);

    return 0;
}

我测试了这段代码,令我惊讶的是testFunc1和testFunc2具有相同的处理速度。我原以为testFunc1会更快,因为它从结构中获取值作为参数并且只需设置它,而testFunc2必须访问var对象,然后从对象内部的struct中获取值。这个编译器是否特定优化(我使用的是VS2010顺便说一句。)或者我只是忽略了什么?

编辑:删除了基于意见的第二个问题。

1 个答案:

答案 0 :(得分:0)

您的示例将通过visual-c ++编译器进行高度优化。 testFunc1可能会更慢,具体取决于用于传递test的注册,而来自testFunc2副本始终是相同的虚拟地址。

为什么? 您的Variable var已在堆栈上创建。它将在创建对象时创建,因此编译器可以预测其虚拟地址。 (您可以在堆上创建Variable对象,因此执行时间稍长。)

[关于公共/私人事物:通常,你可以随意做。我 - 个人 - 相信,在多线程环境中,公开课程的内部结构会增加偶然竞争条件的风险。]