1.7  C++内存模型
1,C++内存模型的基本存储单元是byte。一个byte至少足够大可以容纳基本执行字符集(basic execution char set)的任意成员和Unicode UTF8编码表的8位代码单元(eight-bit code units),并且由一个连续的bit序列组成,这个序列的数量由实现定义。最低有效位(the least significant bit)被称作低阶位(the low-order bit),最高有效位(the most significant bit)被称作高阶位(the high-order bit)。对于一个C++程序来说可用的内存由一个或多个连续的byte序列组成。每个byte有一个唯一的地址。
2,[注释:类型的表达在3.9节中描述。 —— 注释结束]
3,一个内存位置(memory location)是一个标量类型(scalar type)对象或者一个最大邻接非零宽度位域序列。[注释:此语言的多种特性,例如引用和虚函数,可能包含了额外的不能被程序访问但由实现管理的内存位置。  ——  注释结束] 两个线程可以更新和访问不同的内存位置而不互相干涉。
4,[注释:这样一个位域和一个邻接的非位域位于不同的内存位置,并且因此可以并行的被2个线程更新而不互相影响。同样的情况也适用于2个位域,如果其中一个被声明在嵌套的结构体声明中而应一个不在,或者如果他们被一个0宽度位域声明分割开,或者如果他们被一个非位域声明分割开。如果同一结构体中的2个位域之间所有的域都是非0宽度位域,那么并行更新他们并不安全。 ——  注释结束]
5,[例子:一个结构体被声明为:
1 struct {
2     char a;
3     int  b:5;
4     c:11,
5     :0,
6     d:8;
7     struct {int ee:8;} e:
8 }
包含四个不同的内存位置:域a,位域d和e.ee各自是不同的内存位置,并且可以被并发修改而不互相影响。位域b和c不能被并发修改,但是b和a可以。 ——  例子结束]


1.8  C++对象模型
1,C++程序中的架构(constructs)创建,销毁,引用,访问并且操作对象。一个对象是一个存储区域(region of storage)。[注释:函数不是对象,无论其是否以对象一样的方式占用存储(occupies storage)。 —— 注释结束] 对象由定义,由new-expression,或者当必要时由实现创建。一个对象的属性在其被创建时确定。一个对象可以有一个名字。对象有一个存储周期(storage duration),存储周期影响对象的生存周期(lifetime)。对象有一个类型。术语对象类型(object type)指对象被创建的类型。某些对象是多态(polymorphic)的;具体实现为每个此类对象生成信息以使得在程序运行时确定此类对象的对象类型成为可能。对于其它对象,对其中值的解释由用于访问它们的表达式的类型(type of expressions)决定。
2,对象可以包含被称作子对象的其它对象。一个子对象可以是成员子对象(member subobject),基类子对象(base class subobject)或者数组成员(array element)。不是其它任何对象的子对象的对象称作完整对象(complete object)。
3,对于每一个对象x,存在一个对象称作x的完整对象(complete object of x),定义如下:
      —— 如果x是一个完整对象,那么x就是x的完整对象。
      —— 否则,x的完整对象是那个唯一包含x的对象的完整对象。
4,如果一个完整对象,一个数据成员(data member)或者一个数组成员的类型是一个类,那么它的类型被视为最终派生类(most derived class),以区分与它任意基类子对象的类型;一个最终派生类或者非类类型(non-class type)的对象被称作最终派生对象(most derived object)。
5,除非一个最终派生对象是一个位域,其余情况下它的大小(size)必须非零并且必须占据至少一个字节的存储。基类子对象大小可以为零。一个可平凡拷贝(trivially copyable)对象或者一个标准布局类型(standard layout type)对象必须占据连续的存储字节。
6,除非一个对象是位域或者大小为零的基类子对象,其余情况下此对象的地址是它占据的第一个字节的地址。两个非位域对象必须具有不同地址除非这两个对象之一是另一个对象的子对象,或者至少其中一个对象是长度为零的基类子对象并且这两个对象的类型不同。
[例子:
static const char test1 = 'x';
static const char test2 = 'x';
const bool b = &test1 != &test2;  // always true
 —— 例子结束]
7,[注释:C++提供多种基本类型(fundamental types)和几种从既有类型构建新类型的方法。 —— 注释结束]

/***************************************   正文与乱记的分隔线   ****************************************/

与C++98标准相比,byte的定义增加了UTF8的支持(
1.7/1),并且引入了memory location的概念(1.7/3~1.7/5)。显然memory location是为了thread模型(1.10)准备的。(1.8/5)原来是“POD必须占据连续的存储字节”;另外新增了整个(1.8/6)。
posted on 2011-08-31 11:20 Achilleus 阅读(211) 评论(0)  编辑 收藏 引用 所属分类: C++0X

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理