静态初始化--我的理解

原创 2001年09月30日 23:20:00

首先要明确的是,所有的初始化都是运行时完成的。

0) int g;
1) int global = rand();
2) const int ci = 5;

3) struct test
4) {
5)  test() : i_(10) {}
6)  int i_;
7) };

8) test global_object;

9) void fun()
10) {
11)  int local;
12)  int local2 = 100;
13) }

14) int main()
15) {
16)  fun();
17)  static int si;
18)  return 0;
19) }


11 行的local是程序运行到fun()函数中,在stack中分配的,local2同样如此,但它已经初始化为100,有值。
这样的初始化可以视之为“动态初始化”,只有运行到fun()函数,才会初始化,而对于程序中所有的global,static object( include variable)来说,只要程序开始运行,它们都必须初始化好了,这个过程你是不知道的,你只要知道,无论在你的程序的哪个地方,都可以放心的使用它们,绝不会出现access violation。:),故称之为“静态初始化”。

这种数据会放在.exe文件的三个节中。.data(已经初始化的数据), .rdata(只读初始化的数据), .bss(没有初始化的数据),注意:普通临时变量是不会出现在EXE文件中的。由于C++会初始化所有的你没有初始化的数据为0,如上面的0行,所以只牵涉.data,.rdata两个节,bss用于C。

如何实现静态初始化,这个问题太过复杂,我也无法做出高深的解释,简述如下。

__sys_main()
{
 __sti();
 main()
 __std();
}

__sti()中负责执行静态初始化,(在本例中是0,1,2行)然后调用你提供的main(),最后__std()为对象调用dtor。这只是一个思路,并不代表编译器就这样实现。

上例中,0行g以0值放入.data,1行global也是以0值(无法在编译时求值)放入.data,2 行ci是以值5放入.rdata,8 行global_object是以0值放入.data,真正需要在__sti()出现的是ci和test::test(),其它的在程序运行时,EXE文件映象中已经是正确的值。

可以看出,在C中是不需要静态初始化这一过程的,要么只能是常量(编译时求值)(这是C的要求),要么就没有初始化。

(为了提高效率,standard C++ 要求,static object的初始化在其所在函数运行时才开始,似乎也成了“动态”,:)
但它的释放则必须在__std()中).

Java静态初始化,实例初始化以及构造方法

首先有三个概念需要了解: 一.静态初始化:是指执行静态初始化块里面的内容。 二.实例初始化:是指执行实例初始化块里面的内容。 三.构造方法:一个名称跟类的名称一样的方法,特殊在于不带返回值。...
  • clam_clam
  • clam_clam
  • 2011年08月15日 22:34
  • 6527

静态属性、静态方法与静态初始化器

静态属性、静态方法与静态初始化器   static称为静态修饰符,它可以修饰类中的属性和方法。   1.静态属性   被static修饰的属性称为静态属性,这类属性一个最本质的特点是:它们是类的属性,...
  • qq_34163820
  • qq_34163820
  • 2016年08月02日 16:34
  • 630

关于Java的静态初始化块

      这里我们主要讨论下静态初始化块这种情况。      静态初始化块是在类被加载的时候就执行的一块程序,并且一直存在直到程序关闭。也就是说当程序被执行,即classloader将该java程序...
  • deadpanda
  • deadpanda
  • 2010年02月12日 22:30
  • 10562

java中的静态类初始化器与终结器

静态类初始化器 static { //语句 } 静态类初始化器没有返回值,没有参数,其中的变量必须是static型的 静态成员变量和静态初始化块级别相同 public class T...
  • mylovestart
  • mylovestart
  • 2013年01月31日 21:15
  • 4946

java中静态属性,静态方法和静态初始化器

static称为静态修饰符,它可以修饰类中的属性和方法。   1.静态属性   被static修饰的属性称为静态属性,这类属性一个最本质的特点是:它们是类的属性,而不属于任何一个类的具体对象。换句话说...
  • bzhxuexi
  • bzhxuexi
  • 2013年12月27日 10:22
  • 2099

静态类、静态方法、静态代码块及初始化顺序

一,静态类 二,静态方法     [访问权限修饰符] static [返回值类型] 方法名([参数列表]){         语句序列     }     在外部调用静态方法时,可以使用“类名.方法...
  • zlhzlh11
  • zlhzlh11
  • 2016年07月18日 11:38
  • 1121

PHP静态变量初始化一次

PHP中的变量作用范围的一个重要特性就是静态变量(static 变量),仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果。我们先来看看下面的实例:  ...
  • haozi3156666
  • haozi3156666
  • 2014年06月30日 10:33
  • 2368

java类中静态域、块,非静态域、块,构造函数的初始化顺序

这里主要验证两个问题: 1 静态区域   块 动态区域 块  构造函数  的执行顺序 2 初始化的时候和赋值语句的先后顺应是否有关。就是 是不是初始化的时候先为0后又执行赋值语句。 这些东西都是...
  • ygn918042354
  • ygn918042354
  • 2013年05月28日 14:59
  • 1383

jAVA中静态初始化块、初始化块和构造方法的理解

在Java中,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。 非静态初始化块: 作用:给对象进行初始化。...
  • u011554611
  • u011554611
  • 2014年05月21日 00:16
  • 2226

Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)

我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:  Jav...
  • caomiao2006
  • caomiao2006
  • 2016年05月29日 19:10
  • 1134
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:静态初始化--我的理解
举报原因:
原因补充:

(最多只允许输入30个字)