逛奔的蜗牛
我不聪明,但我会很努力
:: ::
新随笔
:: :: ::
管理
::
随笔分类
C/C++(67)
(rss)
Cocoa(26)
(rss)
Java(186)
(rss)
Mac(126)
(rss)
OpenGL(25)
(rss)
Qt(164)
(rss)
Qt自定义Widget(12)
(rss)
Xcode(5)
(rss)
其他编程(94)
(rss)
设计模式(2)
(rss)
外语(4)
(rss)
网文(74)
(rss)
搜索
最新评论
1. re: Java:用 Java 7 运行 IDEA 13
great post
--contact form
C/C++: 内存预先分配与对象构造
template
<
typename T
>
class
Vector {
public
:
Vector() :
elements(
0
), first_free(
0
), end(
0
) {
}
void
push_back(
const
T
&
);
//
.
private
:
static
std::allocator
<
T
>
alloc;
//
Object to get raw memory.
void
reallocate();
//
Get more space and copy existing elements.
T
*
elements;
//
Pointer to first element in the array.
T
*
first_free;
//
Pointer to first free element in the array(no structed).
T
*
end;
//
Pointer to one past the end of the array.
};
template
<
typename T
>
void
Vector
<
T
>
::push_back(
const
T
&
t) {
//
Are we out of range ?
if
(first_free
==
end)
//
Get more space and copy the existing elements to it
reallocate();
alloc.construct(first_free, t);
++
first_free;
}
template
<
typename T
>
void
Vector
<
T
>
::reallocate() {
//
Compute size of current array and
//
allocate space for twice as many elements
std::ptrdiff_t size
=
first_free
-
elements;
std::ptrdiff_t newcapacity
=
2
*
max(size,
1
);
//
Allocate space to hold newcapacity number of elements of type T
T
*
newelements
=
alloc.allocate(newcapacity);
//
Construct copies of the existing elements in new space
uninitialized_copy(elements, first_free, newelements);
//
Destroy the old elements in reverse order
for
(T
*
p
=
first_free; p
!=
elements;) {
alloc.destroy(
--
p);
}
//
deallocate cannot be called on a 0 pointer
if
(elements) {
alloc.deallocate(elements, end
-
elements);
}
//
Make our data structure pointer to the new elements
elements
=
newelements;
first_free
=
elements
+
size;
end
=
elements
+
newcapacity;
}
uninitialized_copy 调用标准copy算法的特殊版本. 这个版本希望目的地是未构造的原始内存,它在目的地复制构造每个元素, 而不是将输入范围的元素赋值给目的地(复制时,左操作数是已经存在,但在无默认构造函数的情况下肯定不行,所以用的是复制构造).
for循环对旧数组中每个对象调用allocator的destroy()函数运行 T 类型的虚构函数来释放旧元素所用的任何资源.
一旦复制和撤销了旧元素,就释放原来数组所用空间. 在调用deallocate之前,必须检查elements是否实际指向一个数组.
posted on 2008-03-15 02:35
逛奔的蜗牛
阅读(348)
评论(0)
编辑
收藏
引用
所属分类:
C/C++
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Qt:FontMetrics
C:函数指针数组的定义
Qt:解读Q_GLOBAL_STATIC(QFontDatabasePrivate, privateDb)
C++:QT插件开发方式
C++:单例 Singleton
OpenGL:展示OpenGL特性的软件Tutors
C++:LIB和DLL的区别与使用
C++:C++ 的指针和句柄
其他编程:版本控制入门简介
C++:位操作基础篇之位操作全面总结
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Powered by:
C++博客
Copyright © 逛奔的蜗牛