本帖最后由 highgear 于 2011-5-10 01:29 编辑
C++与 C 不同的一个地方是,结构(类)可以有成员函数,其中一个重要的部分是 拷贝构造函数。 这个函数顾名思义是利用 copy 来初始化结构(类)。现在加入一个拷贝构造函数到SA结构中,再来看看结果如何 :
typedef struct SA
{
char x[3];
SA(SA& sa) { x[0] = sa.x[0]; } //拷贝构造函数
} A;
void main (void) {
A a2;
a2.x[0] = 1;
A a1 = a2;
a2 = a1;
}
8086汇编代码:
-
- #TEST2#19: A a1 = a2;
- cs:026D 8A46FC mov al,[bp-04]
- cs:0270 8846F8 mov [bp-08],al
- #TEST2#20: a2 = a1;
- cs:0273 8D46FC lea ax,[bp-04]
- cs:0276 16 push ss
- cs:0277 50 push ax
- cs:0278 8D46F8 lea ax,[bp-08]
- cs:027B 16 push ss
- cs:027C 50 push ax
- cs:027D B90300 mov cx,0003
- cs:0280 E8C11E call N_SCOPY@
复制代码
我们发现 A a1 = a2 产生了所希望的精简代码, 但 a2 = a1, 却还是臃肿代码。这是怎么回事? 之间的区别是什么?
A a1 = a2, 由于 a1 处于构造阶段,所以会调用 拷贝构造函数 SA(SA& sa)
{ x[0] = sa.x[0]; } , 而 a2 = a1 则调用了结构(类) 的默认 copy 函数。只要我们重载复制操作, 就可以让 a2 = a1 按照我们的意愿进行复制。
typedef struct SA
{
char x[3];
SA(SA& sa) { x[0] = sa.x[0]; } //拷贝构造函数
void operator=(SA& sa) { x[0] = sa.x[0]; } //复制函数
} A;
此时,再看看 a2 = a1, 也产生了精简的代码。
结论:
1) Keil C 中, 结构直接复制使用了 memcpy 复制结构, 效率低下, 不建议使用。
2) C++ 中, 由于拷贝构造函数以及 = 重载的存在, 可以使用用户自己的复制函数,可以达到很高的效率
3) C++ 中, 要注意 A a1 = a2 与 a1 = a2 之间的不同。
4) C++ 中, 如果没有 拷贝构造函数或者 = 重载的存在, 默认的拷贝函数会被调用。
|