青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0

/********************************************\
|????歡迎轉載, 但請保留作者姓名和原文鏈接, 祝您進步并共勉!???? |
\********************************************/


C++對象模型(6) -? Program Transformation Semantics

作者: Jerry Cat
時間: 2006/05/11
鏈接:?
http://m.shnenglu.com/jerysun0818/archive/2006/05/11/6912.html

2.3 Program Transformation Semantics
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
1). Explicit Initialization:

Given the definition
X x0;
the following three definitions each explicitly initialize its class object with x0:

void foo_bar() {
?? X x1( x0 );
?? X x2 = x0;
?? X x3 = x( x0 );
?? // ...
}
The required program transformation is two-fold:

Each definition is rewritten with the initialization stripped out.
An invocation of the class copy constructor is inserted.
For example, foo_bar() might look as follows after this straightforward, two-fold transformation:

// Possible program transformation Pseudo C++ Code
void foo_bar() {
?? X x1;
?? X x2;
?? X x3;

?? // compiler inserted invocations of copy constructor for X
?? x1.X::X( x0 );
?? x2.X::X( x0 );
?? x3.X::X( x0 );
?? // ...
}
where the call

x1.X::X( x0 );
represents a call of the copy constructor

X::X( const X& xx );

2). Argument Initialization盡量不用傳值法, 要穿指針或引用. 傳值法開銷大效率低,
??? 更要命的是涉及到深淺拷貝以及, 局部變量和臨時對象的銷毀問題.

3). Return Value Initialization(雙重變形, Bjarne Stroutstrup的trick):
(按: 返回值(不是引用或指針,返回的是value), 其實是讓一外部對象的引用做一個"悄然追加"
???? 的參數(編譯器偷著干的, 你是看不見的:), 然后是空返回, 你的返回值呢? 諾, 就是那
???? 以"外追"方式進入函數內部參與處理的引用呵^_^ )

Given the following definition of bar():
X bar()
{
?? X xx;
?? // process xx ...
?? return xx;
}
you may ask how might bar()'s return value be copy constructed from its local object xx?
Stroustrup's solution in cfront is a two-fold transformation:

Add an additional argument of type reference to the class object. This argument will hold the
copy constructed "return value."

Insert an invocation of the copy constructor prior to the return statement to initialize the
added argument with the value of the object being returned.

What about the actual return value, then? A final transformation rewrites the function to have
it not return a value. The transformation of bar(), following this algorithm, looks like this:

// function transformation to reflect application of copy constructor Pseudo C++ Code
void bar( X& __result )
{
?? X xx;

?? // compiler generated invocation of default constructor
?? xx.X::X();
?? // ... process xx

?? // compiler generated invocation of copy constructor
?? __result.X::X( xx );

?? return;
}
Given this transformation of bar(), the compiler is now required to transform each invocation
of bar() to reflect its new definition. For example,

X xx = bar();
is transformed into the following two statements:

// note: no default constructor applied
X xx;
bar( xx );
while an invocation such as

bar().memfunc();
might be transformed into

// compiler generated temporary
X __temp0;
( bar( __temp0 ), __temp0 ).memfunc();
Similarly, if the program were to declare a pointer to a function, such as

X ( *pf )();
pf = bar;
that declaration, too, would need to be transformed:

void ( *pf )( X& );
pf = bar;

4). Optimization at the Compiler Level:
In a function such as bar(), where all return statements return the same named value, it is
possible for the compiler itself to optimize the function by substituting the result argument
for the named return value. For example, given the original definition of bar():

X bar()
{
?? X xx;
?? // ... process xx
?? return xx;
}
__result is substituted for xx by the compiler:

void
bar( X &__result )
{
?? // default constructor invocation Pseudo C++ Code
?? __result.X::X();
?? // ... process in __result directly

?? return;
}
This compiler optimization, sometimes referred to as the Named Return Value (NRV) optimization.

Although the following three initializations are semantically equivalent:

X xx0( 1024 );
X xx1 = X( 1024 );
X xx2 = ( X ) 1024;
in the second and third instances, the syntax explicitly provides for a two-step initialization:
Initialize a temporary object with 1024.

Copy construct the explicit object with the temporary object.

That is, whereas xx0 is initialized by a single constructor invocation

// Pseudo C++ Code
xx0.X::X( 1024 );
a strict implementation of either xx1 or xx2 results in two constructor invocations, a temporary
object, and a call to the destructor of class X on that temporary object:

// Pseudo C++ Code
X __temp0;
__temp0.X::X( 1024 );
xx1.X::X( __temp0 );
__temp0.X::~X();

5). The Copy Constructor: To Have or To Have Not?
??? =============================================
Given the following straightforward 3D point class:

class Point3d {
public:
?? Point3d( float x, float y, float z );
?? // ...
private:
?? float _x, _y, _z;
};
should the class designer provide an explicit copy constructor?

The default copy constructor is considered trivial. There are no member or base class objects
with a copy constructor that need to be invoked. Nor is there a virtual base class or virtual
function associated with the class. So, by default, a memberwise initialization of one Point3d
class object with another results in a bitwise copy. This is efficient. But is it safe?

The answer is yes. The three coordinate members are stored by value. Bitwise copy results in
neither a memory leak nor address aliasing. Thus it is both safe and efficient.

So, how would you answer the question, should the class designer provide an explicit copy
constructor? The obvious answer, of course, is no. There is no reason to provide an instance
of the copy constructor, as the compiler automatically does the best job for you. The more subtle
answer is to ask whether you envision the class's requiring a good deal of memberwise
initialization, in particular, returning objects by value? If the answer is yes, then it makes
excellent sense to provide an explicit inline instance of the copy constructor that is, provided
your compiler provides the NRV optimization(虛擬語氣).

For example, the Point3d class supports the following set of functions:

Point3d operator+( const Point3d&, const Point3d& );
Point3d operator-( const Point3d&, const Point3d& );
Point3d operator*( const Point3d&, int );
etc.
all of which fit nicely into the NRV template
{
?? Point3d result;
?? // compute result
?? return result
}
The simplest method of implementing the copy constructor is as follows:

Point3d::Point3d( const Point3d &rhs )
{
?? _x = rhs._x;
?? _y = rhs._y;
?? _z = rhs._z;
};
This is okay, but use of the C library memcpy() function would be more efficient:

Point3d::Point3d( const Point3d &rhs )
{
?? memcpy( this, &rhs, sizeof( Point3d );
};
Use of both memcpy() and memset(), however, works only if the classes do not contain any
compiler-generated internal members. If the Point3d class declares one or more virtual functions
or contains a virtual base class, use of either of these functions will result in overwriting the
values the compiler set for these members. For example, given the following declaration:

class Shape {
public:
?? // oops: this will overwrite internal vptr!
?? Shape() { memset( this, 0, sizeof( Shape ));
?? virtual ~Shape();
?? // ...
};
the compiler augmentation for the constructor generally looks like this:

// Expansion of constructor Pseudo C++ Code
Shape::Shape()
{
?? // vptr must be set before user code executes
?? __vptr__Shape = __vtbl__Shape;

?? // oops: memset zeros out value of vptr
?? memset( this, 0, sizeof( Shape ));
};
As you can see, correct use of the memset() and memcpy() functions requires some knowledge of the
C++ Object Model semantics! 嘿, 把C庫扯進來了, 強! C庫中許多強調性能,效率的函數是用匯編寫的

Summary: 編譯器盡可能地"優化掉"拷貝構造函數, 代之以NRV...
---------------------------------------------------------
Application of the copy constructor requires the compiler to more or less transform portions of
your program. In particular, consider a function that returns a class object by value for a class
in which a copy constructor is either explicitly defined or synthesized. The result is profound
program transformations both in the definition and use of the function. Also, the compiler
optimizes away the copy constructor invocation where possible, replacing the NRV with an additional
first argument within which the value is stored directly. Programmers who understand these
transformations and the likely conditions for copy constructor optimization can better control the
runtime performance of their programs.

posted on 2006-05-11 03:33 Jerry Cat 閱讀(591) 評論(0)  編輯 收藏 引用

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(7)

隨筆檔案

最新隨筆

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久在线精品| 免费亚洲婷婷| 美女成人午夜| 久久嫩草精品久久久精品| 一区二区日韩伦理片| 国产一区免费视频| 欧美视频在线一区| 欧美韩国日本一区| 性亚洲最疯狂xxxx高清| 欧美日韩中字| 国产婷婷色一区二区三区四区| 午夜精品福利在线观看| 亚洲综合日韩在线| 欧美亚洲一区| 久久国产加勒比精品无码| 悠悠资源网亚洲青| 亚洲性视频网址| aa级大片欧美三级| 91久久在线| 亚洲电影在线免费观看| 亚洲欧美制服另类日韩| 韩曰欧美视频免费观看| 久久久无码精品亚洲日韩按摩| 欧美在线亚洲在线| 欧美日本免费一区二区三区| 欧美午夜不卡视频| 一二三区精品| 亚洲伊人久久综合| 国产一区二区三区高清在线观看| 国产亚洲欧美一区| 亚洲深夜av| 欧美黄色片免费观看| 亚洲第一在线综合网站| 久久人人97超碰人人澡爱香蕉| 久久www免费人成看片高清| 亚洲最新色图| 亚洲欧洲久久| 久久国产一区| 国产亚洲欧美日韩日本| 亚洲欧美日韩精品综合在线观看| 亚洲国产aⅴ天堂久久| 一区二区三区免费观看| 久久国产精品久久精品国产| 国产日韩成人精品| 亚洲男人第一av网站| 亚洲国产精选| 欧美激情一区二区三区不卡| 国产在线精品自拍| 亚洲网友自拍| 欧美高清视频www夜色资源网| 欧美丰满高潮xxxx喷水动漫| 亚洲精品资源| 亚洲精品欧美| 国产精品午夜在线观看| 亚洲欧美视频在线| 亚洲欧美日韩综合| 国产精品永久免费| 亚洲乱码久久| 久久九九热re6这里有精品 | 亚洲精品国偷自产在线99热| 免费看成人av| 亚洲视频视频在线| 欧美久久久久久久久| 亚洲激情在线视频| 99re8这里有精品热视频免费 | 在线观看亚洲视频| 伊人久久综合97精品| 亚洲天堂av综合网| 好吊色欧美一区二区三区四区| 欧美激情偷拍| 国产精品综合视频| 久久亚洲午夜电影| 久久伊人精品天天| 精品成人国产| 久久激情综合网| 欧美亚洲视频在线观看| 久久久久久伊人| 亚洲精选视频免费看| 久久成年人视频| 午夜日韩视频| 国产在线观看91精品一区| 亚洲在线不卡| 性欧美长视频| 欧美日韩大片一区二区三区| 久久国产欧美日韩精品| 欧美亚洲成人免费| 欧美亚洲免费在线| 国产精品久久久久久av下载红粉| 女主播福利一区| 久久亚洲欧洲| 欧美精品成人在线| 亚洲一区二区在线看| 欧美日韩成人在线| 欧美久久影院| 欧美激情第一页xxx| 久久女同精品一区二区| 亚洲午夜视频在线观看| 久久亚洲欧美| 亚洲国产精品视频| 欧美日韩一区二区视频在线| 国产精品久久久久久久久久久久久久 | 亚洲影音一区| 久久精品av麻豆的观看方式| 国产精品你懂的在线| 午夜精品一区二区三区四区| 羞羞漫画18久久大片| 欧美一区日本一区韩国一区| 亚洲一区二区三区四区五区黄| 最新日韩中文字幕| 久久精品人人做人人爽| 日韩一区二区精品| 欧美性色aⅴ视频一区日韩精品| 欧美国产日韩二区| 亚洲裸体俱乐部裸体舞表演av| 美女国内精品自产拍在线播放| 亚洲精品1区| 久久久久99精品国产片| 欧美精品一区在线播放| 日韩一级黄色大片| 国产精品国产三级国产aⅴ入口| 在线不卡亚洲| 久久国产免费| 性色av一区二区三区在线观看| 久久久久久久久久久久久9999| 久久精品一二三区| 欧美一区二区精美| 欧美成人午夜免费视在线看片| 亚洲一区二区伦理| 久久在线视频| 亚洲欧美在线高清| 久久成人久久爱| 国产一区观看| 亚洲影音一区| 欧美一区二区三区另类| 亚洲一区久久久| 亚洲人成网站777色婷婷| 日韩午夜电影av| 美日韩精品免费观看视频| 久久香蕉国产线看观看网| 免费在线一区二区| 亚洲性线免费观看视频成熟| 欧美在线观看一二区| 欧美日本在线观看| 99精品国产在热久久| 欧美一区二区精美| 亚洲激情视频在线播放| 亚洲视频欧洲视频| 欧美成人综合一区| 国内精品久久久久国产盗摄免费观看完整版| 激情五月***国产精品| 午夜免费久久久久| 亚洲欧洲在线观看| 麻豆久久婷婷| 亚洲无限av看| 午夜日韩激情| 裸体女人亚洲精品一区| 亚洲伦理网站| 欧美不卡高清| 久热re这里精品视频在线6| 欧美一区二区三区精品| 香蕉成人伊视频在线观看| 久久这里只精品最新地址| 久久婷婷丁香| 国产日韩一区二区三区在线| 国产尤物精品| 一区二区三区日韩| 亚洲一区欧美| 欧美不卡在线| 久久亚洲欧美国产精品乐播| 一区二区在线观看视频| 久久久99国产精品免费| 午夜一区不卡| 久久亚洲美女| 亚洲人成77777在线观看网| 亚洲免费高清| 久久精品论坛| 亚洲毛片在线看| 久久综合久久88| 久久精品一级爱片| 亚洲视频999| 欧美电影免费观看网站| 亚洲欧洲精品一区二区三区 | 极品尤物久久久av免费看| 久久国产精品一区二区三区| 奶水喷射视频一区| 亚洲综合精品| 久久久xxx| 宅男精品视频| 国产综合色在线视频区| 一本色道久久99精品综合 | 亚洲欧洲一区二区在线播放| 久久久久久综合| 亚洲综合色视频| 亚洲国产精品t66y| 久久精品中文| 久久米奇亚洲| 国产色综合天天综合网| 99视频有精品| 一区视频在线看| 亚洲女性喷水在线观看一区|