banner

供了类似的机制。

  线程局部变量在进入线程时被构建,在退出线程时被析构。它们的生命周期与线程的生命周期一样。每个线程都包含一份这类变量的独立的副本。

tips

  访问线程局部变量可能会比访问静态变量开销更高,这取决于操作系统和编译器。在某些系统中,线程局部存储空间是由线程分配的,所以访问线程局部变量的开销比访问全局变量的开销多一次指令。而在其他系统中,则必须通过线程 ID 索引一张全局表来访问线程局部变量。尽管这个操作的时间开销是常量时间,但是会发生一次函数调用和一些计算,导致访问线程局部变量的开销变得更大。

  自 C++11 开始,用 thread_local 存储类型指示符关分和函数体。可在初始化部分设置成员变量,也可在构造函数的函数体内设置。下面的示例演示了如何初始化成员变量:

要在构造函数的初始化部分赋值,可在用于将构造函数参数列表括起的右括号后面添加一个冒号,再列出要初始化的变量名。在变量名后面添加一对括号,并在括号内包含用于初始化成员变量的表达式。如果要以这种方式设置多个成员变量,就用逗号将成员变量分开。

前面的示例将成员变量speed和wheelSize分别设置为5和12。

警告: 由于不能给引用和常量赋值,因此必须以这种方式初始化它们。

初始化成员变量的效率比给它们赋值高,要明白这一点,必须理解复制构造函数。

及到如何使用数据。程序员常会发现,编写特定的函数来处理特定的数据操作是有好处的(这里讲的好处指的是程序的可靠性更高、修改和调试更为方便)。另外,构思程序时将存储属性与操作结 合起来,便是朝OOP思想迈进了重要的一步;以后将证明这是很有好处的。

我们来看一个简单的案例。假设要使用一个数组来记录房地产的价值(假设拥有房地产)。在这种情况下,程序员必须确定要使用哪种类型。当然,double的取值范围比int和long大,并且提供了足够多的有效位数来精确地表示这些值。接下来必须决定数组元素的数目(对于使用new创建的动态数组来说,可以稍后再决定,但我们希望使事情简单一点)。如果房地产数目不超过5