r *arrayStartAddress)
?
? ? ? ?{
?
? ? ? ? ? ? ?int lastCreated = -1;
?
? ? ? ? ? ? ?try
?
? ? ? ? ? ? ?{
?
? ? ? ? ? ? ? ? ? ? ?for(int i = 0; i < array_size; ++i)
?
? ? ? ? ? ? ? ? ? ? ?{
?
? ? ? ? ? ? ? ? ? ? ? ? ? ?void *objAddr = arrayStartAddress + i * array_element_size;
?
? ? ? ? ? ? ? ? ? ? ? ? ? ?Ctr(objAddr);
?
? ? ? ? ? ? ? ? ? ? ? ? ? ?lastCreated = i;
?
? ? ? ? ? ? ? ? ? ? ?}
?
? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? catch(...)
?
? ? ? ? ? ? ? {
?
? ? ? ? ? ? ? ? ? ? // destroy partially created array in case or fault
?
? ? ? ? ? ? ? ? ? ? for(int i = 0; i <= lastCreated; ++i)
?
? ? ? ? ? ? ? ? ? ? {
?
? ? ? ? ? ? ? ? ? ? ? void *objAddr = arrayStartAddress + i * array_element_size;
?
? ? ? ? ? ? ? ? ? ? ? Dtr (objAddr);
?
? ? ? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ?}
?
? ? ? ?}
?
?比较伪码我们看出:Vector_constructor_iterator_with_dtor 和 Vector_constructor_iterator 的主要区别是增加了异常处理的机制,用来销毁“已经构造”的矩阵元素。
?
运行 TestArraySemantics 表明,带有destructor的类的array构造速度下降了近 300%。
?
所以,去除不必要的destructor的重要性又一次充分体现。
?
结论
C++ built-in array对class object的支持是十分重要的语言构造,它是
C++把class object和原始变量同样对待的又一反映,它大大增加了C++的附加值。
?
然而我们一如既往,需要对C++这一语言构造的语义深入了解。以便正确使用C++ built-in array。