2017-04-07 137 views
0

当我在几个翻译单元中调用以下内联函数时,我对“引擎盖下”究竟发生了什么感兴趣。内嵌函数中的静态变量

namespace some_name 
{ 
    inline const float& get_float() 
    { 
     static const float a = 5.0f; 
     return a; 
    } 
} 

我的目的是创建一个外部连接的变量“a”,其可以在整个代码中使用(如果包括与命名空间中的报头),而且还我想防止任何改变这个变量。从测试看来,我似乎成功了,但是我对第一次和接下来几次调用此函数时发生的事情感兴趣。

其他问题我是否用静态变量声明/定义来污染全局名称空间?

+1

作为使函数返回静态常量浮点数的一种替代方法,为什么不把它作为类的成员变量,甚至是命名空间;它仍然是const ... – UKMonkey

+0

UKMonkey我不确定,如果我这样做,那么每次我在不同的翻译单元中使用该变量时,我会得到一个const float类型的副本。 – user3271640

+1

你确定这种方式'a'是外部链接吗?为什么你甚至需要一个外部连接的常量?外部链接表明多个编译单元共享变量的一个实例,当它变化时,每个单元都会读取更新后的值。但恒定不会改变。而且,在许多情况下,编译器会将常数值直接嵌入到指令中,以至于它甚至不会出现在内存中。 –

回答

0

但是我对第一次和接下来几次调用这个函数时会发生什么感兴趣。

初始化是静态的(不依赖于运行时的任何东西),所以它可能在程序开始时执行。所有的调用只是返回一个对静态对象的引用。而这些调用可能是内联的扩展,所以直接使用静态对象。

更简单的选项是在名称空间中使用全局变量。

其他问题:我用静态变量声明/定义污染全局名称空间吗?

不是。静态变量是本地的,所以不会污染任何名称空间。函数本身会“污染”声明它的名称空间。

+0

命名空间中的“静态”变量会做相反的事情,即为每个包含头的TU定义一个这样的变量。 – Quentin

+0

@Quentin是的,我的意思是一个全局变量(即静态存储的非局部变量)。尽管如此,这对于常量来说并不重要,因为不同编译单元的重复无论如何都被压扁了,不是吗? – user2079303

+0

@Quentin这正是我很好奇的。这就是为什么我没有在命名空间中定义变量的原因。我想直接在包含这个头的所有TU中使用特定的一个静态对象。 – user3271640