WEB开发网
开发学院软件开发VC 消息值,托管字符串,扰乱代码及其它 阅读

消息值,托管字符串,扰乱代码及其它

 2006-07-20 11:39:33 来源:WEB开发网   
核心提示: String* s = new String(S"foo");GCHandle h = GCHandle::Alloc(s, GCHandleType::Pinned);IntPtr ptr = h.AddrOfPinnedObject();_tprintf(_T(&q
String* s = new String(S"foo");
GCHandle h = GCHandle::Alloc(s, GCHandleType::Pinned);
IntPtr ptr = h.AddrOfPinnedObject();
_tprintf(_T(" string at %p\n"), ptr.ToInt32());
h.Free();

这创建了固定句柄,于是可以调用 GCHandle::AddrOfPinnedObject 获得固定对象的地址。下面是运行新程序的测试结果:

C:\>StrTime2 5
Test 1: Allocate 5 strings using LPCTSTR
string at 04AC21E0
string at 04AC22D8
string at 04AC2318
string at 04AC2358
string at 04AC2398
Test 2: Allocate 5 strings using .NET S literal
string at 04AC218C
string at 04AC218C
string at 04AC218C
string at 04AC218C
string at 04AC218C

无需分配5000万个字符串;5个就足以搞定了。正如你所看到的,每次调用新的 String(_T("foo")) 5次或无 穷次来生成一个新的对象,而调用新的 String(S"foo") 加载相同的对象。因此用 C++ 文字量进行5000万字符串测试花费如此之长时间的真正原因是运行时不得不分配大量的内存并执行垃圾收集。

所有这些可能已经比你期望知道的更多了,但是这是为了好玩我还写做另一个修改,StrTime3,它在分配字符串之前强制进行垃圾收集,这时则显示“认为被分配的”内存数量 (正如 GC::GetTotalMemory 文档里所描述的那样):

GC::Collect();
GC::WaitForPendingFinalizers();
// allocate strings
printf("TotalMemory = %d\n", GC::GetTotalMemory(false));

而这里是结果:

上一页  1 2 3 4 5 6 7 8  下一页

Tags:消息 托管 字符串

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接