没有合适的资源?快使用搜索试试~ 我知道了~
C++ 编译花了大量精力使得class和原始类(primitive types)的用法一致。比如array的应用: A a[100];// A is class int b[100]; 虽然a是用户定义的类的对象,但是用起来与整数型的array相比并无差别。我们现在看看语义上的差别。 A 是POD类(完全具有值语义的类) 如果A是具有值语义的POD(参见我关于值语义的博客:http://www.cnblogs.com/ly8838/p/3929025.html ),测试显示A 的创建和读写与一般变量没有任何差别,当然性能也不会有差别。 也是说,A a[3]
资源详情
资源评论
资源推荐
C++ Built-In Array的语义的语义
C++ 编译花了大量精力使得class和原始类(primitive types)的用法一致。比如array的应用:
A a[100];// A is class
int b[100];
虽然a是用户定义的类的对象,但是用起来与整数型的array相比并无差别。我们现在看看语义上的差别。
A 是POD类(完全具有值语义的类)
如果A是具有值语义的POD(参见我关于值语义的博客:http://www.cnblogs.com/ly8838/p/3929025.html ),测试显示A
的创建和读写与一般变量没有任何差别,当然性能也不会有差别。
也是说,A a[3] ;和 A a1, a2,a3; 在语义上完全一样,也没有丝毫性能上的区别。
A 是有默认的构造函数(但没有destructor)的类
我们有一个简单的struct:
struct StackObject
{
int _a;
int _b;
StackObject(): _a(0), _b(1)
{
}
};
和简单的测试函数:
void TestArraySemantics()
{
StackObject sa[10]; //line 1:call vector constructor iterator
sa[0]._a= 1;
sa[9]._b = 10;
}
在VC++2010中运行时,我们看到line1调用了编译自生的函数。这是一个通用的“矩阵构造循环(vector constructor
iterator)”:
它的大致实施如下:
void Vector_constructor_iterator(
int array_size,
int array_element_size,
void (*Ctr)(void *addr),
char *arrayStartAddress)
{
for(int i = 0; i < array_size; ++i)
{
void *objAddr = arrayStartAddress + i * array_element_size;
Ctr(objAddr);
}
}
这是一个典型的 C 函数,它将 StackObject 的构造函数作为函数指针进行调用。
从这个函数来看,它使得A a[3]; 和A a1,a2, a3; 的语义发生了根本变化。我们不但要调用编译产生的函数,还要用
指针间接地调用StackObject的构造函数。测试结果显示,用array比不用array的“构造”速度大约下降30%。考虑到array的应用
价值,这个速度的下降是可以理解和接受的。
A 是有默认构造函数以及destructor的类
加了destructor后,A a[10] 的语义又有了新的变化。编译必须保证所有创建的object“全部”被摧毁,所以它必须“记住”创建
过程中的热点。
我们加另一个dummy 类,来测试destructor对array 的影响:
struct StackObject2
{
int _a;
int _b;
StackObject2(): _a(0), _b(1)
{
}
~StackObject2()
{
_a = _b = 0;
}
};
我们的测试函数改为
void TestArraySemantics()
{
clock_t begin = clock();
weixin_38643212
- 粉丝: 4
- 资源: 931
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0