1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
---|
2 | <!-- saved from url=(0098)http://devnet.developerpipeline.com/documents/s=9843/q=1/cuj0512alexandrescu/0512alexandrescu.html --> |
---|
3 | <HTML><HEAD><TITLE>Developer::Pipelines | Policy-Based Memory Allocation</TITLE> |
---|
4 | <META http-equiv=Content-Type content="text/html; charset=iso-8859-1"> |
---|
5 | <META content=NOARCHIVE name=GOOGLEBOT> |
---|
6 | <META http-equiv=Description |
---|
7 | content="The way your application allocates memory can have a dramatic effect on its performance. Modern general-purpose memory allocators are pretty efficient, but there's always room for improvement."><LINK |
---|
8 | rev=Stylesheet href="heaplayers-article-cuj_files/pipelines_fonts.css" |
---|
9 | type=text/css rel=Stylesheet><LINK rev=Stylesheet |
---|
10 | href="heaplayers-article-cuj_files/pipelines_layout.css" type=text/css |
---|
11 | rel=Stylesheet><LINK rev=Stylesheet |
---|
12 | href="heaplayers-article-cuj_files/shared.css" rel=Stylesheet><LINK |
---|
13 | rev=Stylesheet href="heaplayers-article-cuj_files/topics.css" rel=Stylesheet> |
---|
14 | <SCRIPT language=JavaScript1.2 src="heaplayers-article-cuj_files/stm31.js" |
---|
15 | type=text/javascript></SCRIPT> |
---|
16 | <!-- pop up openscript --> |
---|
17 | <SCRIPT type=text/javascript> |
---|
18 | function openScript(url, width, height) { |
---|
19 | var Win = window.open(url,"openScript",'width=' + width + |
---|
20 | ',height=' + height + |
---|
21 | ',resizable=1,scrollbars=yes,menubar=yes,status=yes' ); |
---|
22 | } |
---|
23 | </SCRIPT> |
---|
24 | |
---|
25 | <META content="MSHTML 6.00.2900.2802" name=GENERATOR></HEAD> |
---|
26 | <BODY vLink=#003366 link=#003366 bgColor=#ffffff leftMargin=0 topMargin=0 |
---|
27 | marginheight="0" marginwidth="0"><!-- SiteCatalyst code version: G.7.Copyright 1997-2004 Omniture, Inc. More info available athttp://www.omniture.com --> |
---|
28 | <SCRIPT language=JavaScript><!--/* You may give each page an identifying name, server, and channel onthe next lines. */ |
---|
29 | var s_pageName="http://devnet.developerpipeline.com/cpp/cuj0512alexandrescu/" |
---|
30 | var s_server="devnet.developerpipeline.com" |
---|
31 | var s_channel="http://devnet.developerpipeline.com/cpp/" |
---|
32 | var s_pageType="/SDMG/Publications/CUJ|/SDMG/Languages/C++" |
---|
33 | var s_prop1="NO_USER" |
---|
34 | var s_prop2="" |
---|
35 | var s_prop3="" |
---|
36 | var s_prop4="" |
---|
37 | var s_prop5="" |
---|
38 | var s_prop6="" |
---|
39 | var s_prop7="" |
---|
40 | var s_prop8="" |
---|
41 | var s_prop9="" |
---|
42 | var s_prop10="" |
---|
43 | /* E-commerce Variables */ |
---|
44 | var s_campaign="" |
---|
45 | var s_state="" |
---|
46 | var s_zip="" |
---|
47 | var s_events="" |
---|
48 | var s_products="" |
---|
49 | var s_purchaseID="" |
---|
50 | var s_eVar1="" |
---|
51 | var s_eVar2="" |
---|
52 | var s_eVar3="" |
---|
53 | var s_eVar4="" |
---|
54 | var s_eVar5="" |
---|
55 | var s_account="cmpdevnetdeveloperpipelinecom" |
---|
56 | /********* INSERT THE DOMAIN AND PATH TO YOUR CODE BELOW ************///--></SCRIPT> |
---|
57 | |
---|
58 | <SCRIPT language=JavaScript |
---|
59 | src="heaplayers-article-cuj_files/s_code_remote.js"></SCRIPT> |
---|
60 | <!-- End SiteCatalyst code version: G.7. --> |
---|
61 | <DIV class=border> |
---|
62 | <TABLE cellSpacing=0 cellPadding=0 width=940 border=0> |
---|
63 | <TBODY> |
---|
64 | <TR> |
---|
65 | <TD vAlign=top align=left><!-- top banner table --> |
---|
66 | <TABLE cellSpacing=0 cellPadding=0 width=770 bgColor=#ffffff border=0> |
---|
67 | <TBODY> |
---|
68 | <TR> |
---|
69 | <TD width=1 bgColor=#ffffff><IMG height=2 hspace=0 |
---|
70 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD> |
---|
71 | <TD width=769 bgColor=#ffffff><IMG height=2 hspace=0 |
---|
72 | src="heaplayers-article-cuj_files/blank.gif" width=769 |
---|
73 | border=0></TD></TR> |
---|
74 | <TR> |
---|
75 | <TD width=1 bgColor=#ffffff><IMG height=94 hspace=0 |
---|
76 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD> |
---|
77 | <TD align=middle width=769 bgColor=#ffffff><!-- TOP AD --><!-- AD: 'http://localhost:8085/html.ng/site=sdmg&affiliate=sdmgdeveloperpipeline&pagepos=top&catid=&site_section=9843&articleid=141768&target=cpp&country=&state=' --><!-- Sniffer Code for Flash version=60 --> |
---|
78 | <SCRIPT language=JavaScript> |
---|
79 | <!-- |
---|
80 | var swf_click = "http://as.cmpnet.com/event.ng/Type=click&FlightID=45537&AdID=80364&TargetID=4722&Segments=1411,3108,3448,4875,5817,5871&Targets=2625,2878,4667,4722&Values=34,46,51,63,77,83,90,100,140,203,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/"; |
---|
81 | var dcswf_click = escape(swf_click); |
---|
82 | var ShockMode = 0; |
---|
83 | var plugin = (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"]) ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0; |
---|
84 | |
---|
85 | if (plugin && parseInt(plugin.description.substring(plugin.description.indexOf(".")-1)) >= 6) |
---|
86 | { |
---|
87 | ShockMode = 1; |
---|
88 | } |
---|
89 | else if (navigator.userAgent && navigator.userAgent.indexOf("MSIE")>=0 |
---|
90 | && (navigator.userAgent.indexOf("Windows 95")>=0 || navigator.userAgent.indexOf("Windows 98")>=0 || navigator.userAgent.indexOf("Windows NT")>=0)) { |
---|
91 | document.write('<SCRIPT LANGUAGE=VBScript\> \n'); |
---|
92 | document.write('on error resume next \n'); |
---|
93 | document.write('ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.6")))\n'); |
---|
94 | document.write('<\/SCRIPT\> \n'); |
---|
95 | } |
---|
96 | if ( ShockMode ) { |
---|
97 | document.write('<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'); |
---|
98 | document.write(' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"'); |
---|
99 | document.write(' ID=flashad WIDTH=728 HEIGHT=90>'); |
---|
100 | document.write(' <PARAM NAME=movie VALUE="http://i.cmpnet.com/ads/graphics/as5/cc/flash/banner_728x90c_1209.swf?clickTag='+dcswf_click+'"> '); |
---|
101 | document.write(' <PARAM NAME=quality VALUE=high> '); |
---|
102 | document.write(' <PARAM NAME=wmode VALUE=opaque> '); |
---|
103 | document.write(' <EMBED SRC="http://i.cmpnet.com/ads/graphics/as5/cc/flash/banner_728x90c_1209.swf?clickTag='+dcswf_click+'" QUALITY=high WMODE=opaque '); |
---|
104 | document.write(' NAME=flashad swLiveConnect=TRUE WIDTH=728 HEIGHT=90'); |
---|
105 | document.write(' TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">'); |
---|
106 | document.write('</EMBED>'); |
---|
107 | document.write('</OBJECT>'); |
---|
108 | } else if (!(navigator.appName && navigator.appName.indexOf("Netscape")>=0 && navigator.appVersion.indexOf("2.")>=0)){ |
---|
109 | document.write('<A HREF="http://as.cmpnet.com/event.ng/Type=click&FlightID=45537&AdID=80364&TargetID=4722&Segments=1411,3108,3448,4875,5817,5871&Targets=2625,2878,4667,4722&Values=34,46,51,63,77,83,90,100,140,203,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/" target="_top"><IMG SRC="http://i.cmpnet.com/ads/graphics/as5/cc/banner_728x90c.gif" WIDTH=728 HEIGHT=90 BORDER=0></A>'); |
---|
110 | } |
---|
111 | //--> |
---|
112 | </SCRIPT> |
---|
113 | <NOEMBED><A |
---|
114 | href="http://as.cmpnet.com/event.ng/Type=click&FlightID=45537&AdID=80364&TargetID=4722&Segments=1411,3108,3448,4875,5817,5871&Targets=2625,2878,4667,4722&Values=34,46,51,63,77,83,90,100,140,203,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/" |
---|
115 | target=_top><IMG height=90 |
---|
116 | src="heaplayers-article-cuj_files/banner_728x90c.gif" width=728 |
---|
117 | border=0></A> </NOEMBED><NOSCRIPT><A |
---|
118 | href="http://as.cmpnet.com/event.ng/Type=click&FlightID=45537&AdID=80364&TargetID=4722&Segments=1411,3108,3448,4875,5817,5871&Targets=2625,2878,4667,4722&Values=34,46,51,63,77,83,90,100,140,203,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/" |
---|
119 | target=_top><IMG height=90 |
---|
120 | src="heaplayers-article-cuj_files/banner_728x90c.gif" width=728 |
---|
121 | border=0></A> </NOSCRIPT><IMG height=1 src="" width=1 border=0> </TD> |
---|
122 | <TR> |
---|
123 | <TD width=1 bgColor=#ffffff><IMG height=3 hspace=0 |
---|
124 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD> |
---|
125 | <TD width=769 bgColor=#ffffff><IMG height=3 hspace=0 |
---|
126 | src="heaplayers-article-cuj_files/blank.gif" width=769 |
---|
127 | border=0></TD></TR> |
---|
128 | <TR> |
---|
129 | <TD width=770 bgColor=#000066 colSpan=2><IMG height=2 hspace=0 |
---|
130 | src="heaplayers-article-cuj_files/blank.gif" width=770 |
---|
131 | border=0></TD></TR></TBODY></TABLE><!-- end top banner table --><!-- header table --><MAP |
---|
132 | id=header name=header><AREA shape=RECT coords=149,22,489,67 |
---|
133 | href="http://www.developerpipeline.com/"></MAP> |
---|
134 | <TABLE cellSpacing=0 cellPadding=0 width=770 bgColor=#ffffff border=0> |
---|
135 | <TBODY> |
---|
136 | <TR height=69> |
---|
137 | <TD vAlign=top width=68><A href="http://www.cmp.com/"><IMG height=69 |
---|
138 | hspace=0 src="heaplayers-article-cuj_files/cmp_logo.gif" width=68 |
---|
139 | border=0></A></TD> |
---|
140 | <TD vAlign=top><IMG height=69 |
---|
141 | src="heaplayers-article-cuj_files/top_header.jpg" width=702 |
---|
142 | useMap=#header border=0></TD></TR></TBODY></TABLE><!-- end header table --><!-- search/utility nav table --> |
---|
143 | <TABLE cellSpacing=0 cellPadding=0 width=770 bgColor=#ffffff border=0> |
---|
144 | <TBODY> |
---|
145 | <TR> |
---|
146 | <TD bgColor=#000066><IMG height=1 hspace=0 |
---|
147 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD> |
---|
148 | <TD width=1 bgColor=#000066><IMG height=1 hspace=0 |
---|
149 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD> |
---|
150 | <TD width=1 bgColor=#ffffff><IMG height=1 hspace=0 |
---|
151 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD> |
---|
152 | <TD width=1 bgColor=#000066><IMG height=1 hspace=0 |
---|
153 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD> |
---|
154 | <TD bgColor=#000066><IMG height=1 hspace=0 |
---|
155 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD></TR> |
---|
156 | <TR> |
---|
157 | <TD><SPAN class=side><SPAN class=black12Bold>Developer Network |
---|
158 | Partners:</SPAN> <IMG height=1 hspace=0 |
---|
159 | src="heaplayers-article-cuj_files/blank.gif" width=10 border=0> <A |
---|
160 | class=black12Bold href="http://www.cuj.com/">C/C++ Users Journal</A> |
---|
161 | <IMG height=8 hspace=0 src="heaplayers-article-cuj_files/blank.gif" |
---|
162 | width=10 border=0> <A class=black12Bold |
---|
163 | href="http://www.ddj.com/">Dr. Dobb's Journal</A> <IMG height=1 |
---|
164 | hspace=0 src="heaplayers-article-cuj_files/blank.gif" width=10 |
---|
165 | border=0> <A class=black12Bold |
---|
166 | href="http://www.sdmagazine.com/">Software Development</A> |
---|
167 | </SPAN></TD> |
---|
168 | <TD width=1 bgColor=#000066><IMG height=1 hspace=0 |
---|
169 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD> |
---|
170 | <TD width=1 bgColor=#ffffff><IMG height=1 hspace=0 |
---|
171 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD> |
---|
172 | <TD width=1 bgColor=#000066><IMG height=1 hspace=0 |
---|
173 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD><!-- UTILITY NAV --> |
---|
174 | <TD align=middle><SPAN class=side><A class=black12Bold |
---|
175 | href="http://www.developerpipeline.com/contact.jhtml">Contact Us</A> |
---|
176 | <IMG height=8 hspace=0 src="heaplayers-article-cuj_files/blank.gif" |
---|
177 | width=18 border=0> <A class=black12Bold |
---|
178 | href="http://www.developerpipeline.com/about.jhtml">About Us</A> |
---|
179 | </SPAN></TD></TR></TBODY></TABLE><!-- end utility nav table --><!-- MAIN NAVIGATION TABS --> |
---|
180 | <TABLE cellSpacing=0 cellPadding=0 width=770 bgColor=#ffffff border=0 |
---|
181 | table_name="topNavigationTable"> |
---|
182 | <TBODY> |
---|
183 | <TR> |
---|
184 | <TD><A href="http://www.developerpipeline.com/news"><IMG height=29 |
---|
185 | hspace=0 src="heaplayers-article-cuj_files/nav_news_dp.gif" |
---|
186 | border=0></A></TD> |
---|
187 | <TD><A href="http://www.developerpipeline.com/trends"><IMG height=29 |
---|
188 | hspace=0 src="heaplayers-article-cuj_files/nav_trends_dp.gif" |
---|
189 | border=0></A></TD> |
---|
190 | <TD><A href="http://www.developerpipeline.com/howto"><IMG height=29 |
---|
191 | hspace=0 src="heaplayers-article-cuj_files/nav_howto_dp.gif" |
---|
192 | border=0></A></TD> |
---|
193 | <TD><A href="http://productfinder.developerpipeline.com/"><IMG |
---|
194 | height=29 hspace=0 |
---|
195 | src="heaplayers-article-cuj_files/nav_productfinder_dp.gif" |
---|
196 | border=0></A></TD> |
---|
197 | <TD><A href="http://www.developerpipeline.com/coding"><IMG height=29 |
---|
198 | alt="Coding & Scripting" hspace=0 |
---|
199 | src="heaplayers-article-cuj_files/nav_coding_dp.gif" |
---|
200 | border=0></A></TD> |
---|
201 | <TD><A href="http://www.developerpipeline.com/design"><IMG height=29 |
---|
202 | alt="Design & Process" hspace=0 |
---|
203 | src="heaplayers-article-cuj_files/nav_design_dp.gif" |
---|
204 | border=0></A></TD> |
---|
205 | <TD><A href="http://www.developerpipeline.com/tools"><IMG height=29 |
---|
206 | alt=Tools hspace=0 |
---|
207 | src="heaplayers-article-cuj_files/nav_tools_dp.gif" border=0></A></TD> |
---|
208 | <TD><A href="http://www.developerpipeline.com/business"><IMG |
---|
209 | height=29 alt="Business & Careers" hspace=0 |
---|
210 | src="heaplayers-article-cuj_files/nav_business_dp.gif" |
---|
211 | border=0></A></TD></TR></TBODY></TABLE><!-- END MAIN NAVIGATION TABS --><!-- user notification table --><!-- |
---|
212 | <br> |
---|
213 | <table border="0" cellpadding="2" cellspacing="1" bgcolor="CC6600"> |
---|
214 | <tr> |
---|
215 | <td bgcolor="FFD673">Some content requires registration to the CMP Developer Network. |
---|
216 | Sign up today!.</td> |
---|
217 | </tr> |
---|
218 | </table> |
---|
219 | --><!-- end user notification table --><!-- MAIN CONTENT TABLE --> |
---|
220 | <TABLE cellSpacing=0 cellPadding=0 width=770 bgColor=#ffffff border=0> |
---|
221 | <TBODY> |
---|
222 | <TR> |
---|
223 | <TD><IMG height=1 hspace=0 |
---|
224 | src="heaplayers-article-cuj_files/blank.gif" width=1 border=0></TD></TR> |
---|
225 | <TR> |
---|
226 | <TD> |
---|
227 | <TABLE cellSpacing=0 cellPadding=5 width="100%" border=0> |
---|
228 | <TBODY> |
---|
229 | <TR vAlign=top> |
---|
230 | <TD><A |
---|
231 | href="http://devnet.developerpipeline.com/">Developer::Pipelines</A> |
---|
232 | > <A |
---|
233 | href="http://devnet.developerpipeline.com/cpp/">C++</A><BR><BR></TD> |
---|
234 | <TD> </TD> |
---|
235 | <TD align=right><!-- log in --><!-- |
---|
236 | <a href='https://www.sdmediagroup.com/reg/?site=devnet.developerpipeline.com&content=http://devnet.developerpipeline.com/'><b>LOG IN</b></a> • |
---|
237 | <a href=/resetpassword.html>Forgot password?</a> • |
---|
238 | <a href=http://www.sdmediagroup.com/reg/faq.html>Registration FAQ</a> <br> |
---|
239 | --><!-- end log in --><!-- |
---|
240 | <a href="javascript:openScript('http://www.sdmediagroup.com/reg/faq.html#compare',650,480)"><img src="/images/new/premium_bullet.gif" hspace="0" vspace="0" border="0"></a> Denotes content for All Access members only |
---|
241 | --></TD></TR></TBODY></TABLE></TD></TR> |
---|
242 | <TR> |
---|
243 | <TD vAlign=top align=left><!-- jumbobox ad --><!-- <table border="0" align="right" cellpadding="5" cellspacing="0"> |
---|
244 | <tr> |
---|
245 | <td> |
---|
246 | <mpdoc:Ad group="sdmg" site="sdmgdeveloperpipeline" pagepos="jumbobox" documentsonly="true" spot="jumbobox"> |
---|
247 | </td> |
---|
248 | </tr> |
---|
249 | </table>--><!-- end jumbobox ad --><!-- IMG height=40 hspace=5 src="java.gif" vspace=5 width=460 --> |
---|
250 | <H1><FONT color=#5f92c7>Developer::</FONT>C++ Pipeline</H1><!-- -------- BEGIN Nav Anchors --> |
---|
251 | <P><A class=header |
---|
252 | href="http://devnet.developerpipeline.com/cpp/index.html#articles">Articles</A> |
---|
253 | | <A class=header |
---|
254 | href="http://devnet.developerpipeline.com/cpp/index.html#books">Books</A> |
---|
255 | | <A class=header |
---|
256 | href="http://devnet.developerpipeline.com/cpp/index.html#showcase">Products</A> |
---|
257 | | <A class=header |
---|
258 | href="http://devnet.developerpipeline.com/cpp/index.html#papers">Whitepapers</A> |
---|
259 | | <A class=header |
---|
260 | href="http://devnet.developerpipeline.com/cpp/index.html#events">Training/Conferences</A> |
---|
261 | | <A class=header |
---|
262 | href="http://devnet.developerpipeline.com/cpp/index.html#forum">Discussion |
---|
263 | Forum</A> | <A class=header |
---|
264 | href="http://syndication.sdmediagroup.com/feeds/public/cmp_devnet_c++.xml">C++ |
---|
265 | RSS Feed </A></P><!-- -------- END Nav Anchors --><!-- -------- BEGIN Vendor --><!-- AD: 'http://localhost:8085/html.ng/site=sdmg&affiliate=sdmgdeveloperpipeline&pagepos=logo&catid=&site_section=9843&articleid=141768&target=cpp&country=&state=' --><A>This |
---|
266 | Pipeline Sponsored By: </A><A |
---|
267 | href="http://as.cmpnet.com/event.ng/Type=click&FlightID=45541&AdID=75588&TargetID=4729&Segments=1411,3108,3448,4875,5825,5867&Targets=2625,2878,4729&Values=34,46,51,63,77,83,90,100,140,442,618,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/"><IMG |
---|
268 | src="heaplayers-article-cuj_files/intel_logo2.gif" align=middle |
---|
269 | border=0></A><IMG height=1 src="" width=1 border=0> |
---|
270 | <HR align=left noShade SIZE=1> |
---|
271 | <!-- ---------- End Vendor --><!-- jumbobox ad --> |
---|
272 | <TABLE cellSpacing=0 cellPadding=5 align=right border=0> |
---|
273 | <TBODY> |
---|
274 | <TR> |
---|
275 | <TD><!-- AD: 'http://localhost:8085/html.ng/site=sdmg&affiliate=sdmgdeveloperpipeline&pagepos=jumbobox&catid=&site_section=9843&articleid=141768&target=cpp&country=&state=' --><A |
---|
276 | href="http://as.cmpnet.com/event.ng/Type=click&FlightID=45540&AdID=75586&TargetID=4718&Segments=1411,3108,3448,4569,4875,5819,5866&Targets=2625,2878,3885,4665,4718&Values=34,46,51,63,77,83,90,100,140,290,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=IP,127.0.0.1,&Redirect=http://" |
---|
277 | target=_parent><IMG height=1 alt="" |
---|
278 | src="C:\home\emery\projects\heaplayers\doc\heaplayers-article-cuj_files\blank(1).gif" |
---|
279 | width=1 border=0></A><IMG height=1 src="" width=1 border=0> |
---|
280 | </TD></TR></TBODY></TABLE><!-- end jumbobox ad --><!--Copyright © C/C++ Users Journal--> |
---|
281 | <P><I>C/C++ Users Journal</I> December, 2005</P> |
---|
282 | <H1>Policy-Based Memory Allocation</H1> |
---|
283 | <H2>Fine-tuning your memory management</H2> |
---|
284 | <H3>By Andrei Alexandrescu and Emery Berger</H3><I>Andrei |
---|
285 | Alexandrescu is a graduate student in Computer Science at the |
---|
286 | University of Washington and author of Modern C++ Design. He can be |
---|
287 | contacted at andrei@metalanguage.com.</I> |
---|
288 | <HR> |
---|
289 | |
---|
290 | <P>One of the perks of doing hard work for next to no money, an |
---|
291 | activity also known as being a graduate student, is that you get to |
---|
292 | rub shoulders with researchers working on interesting problems. I've |
---|
293 | had the pleasure of meeting in person both Emery Berger and Kathryn |
---|
294 | McKinley, two of the authors (with Benjamin Zorn) of "Composing |
---|
295 | High-Performance Memory Allocators" [6], a paper that I found highly |
---|
296 | interesting for "I can't believe I didn't think of that" reasons. |
---|
297 | But let's start at the beginning.</P> |
---|
298 | <P>One chapter of <I>Modern C++ Design</I> [2] is somewhat different |
---|
299 | than all the others. Actually, very different. While the book is |
---|
300 | dedicated to creating elegant, flexible, extensible designs, one |
---|
301 | chapter stands out like a sore thumb by actually describing one |
---|
302 | fixed, monolithic, rigid, awkward piece of software: Loki's small |
---|
303 | object allocator. Somehow, I thought that memory management was a |
---|
304 | low-level operation and, as such, didn't lend itself to the elegant |
---|
305 | exploits of policy-based design. At the same time, some of the |
---|
306 | compiler-provided <B>new</B>/<B>delete</B> implementations were |
---|
307 | pretty bad at dealing with small objects, so I felt there would be a |
---|
308 | need for something to fill the void. So I sat down and wrote an |
---|
309 | implementation that has portability as its only merit; other than |
---|
310 | that, it's not particularly performant, interesting, or original. |
---|
311 | The main problem with Loki's allocator, however, does not lie in its |
---|
312 | implementation (which, by the way, has been entirely rewritten by |
---|
313 | Rich Sposato, to the end of greatly improving its performance), but |
---|
314 | in its design, which is not configurable nor extensiblejust a few |
---|
315 | monolithic classes, much like what you'd expect in the bad ol' |
---|
316 | days.</P> |
---|
317 | <P>However, at about the same time, Emery Berger and others were |
---|
318 | experimenting with a mixin-based memory allocator for C++ that is at |
---|
319 | the same time highly efficient (rivaling the best general-purpose |
---|
320 | allocators out there), highly customizable (rivaling the best |
---|
321 | special-purpose allocators, too), and highly portable by virtue of |
---|
322 | its customizable design! As soon as I became acquainted with that |
---|
323 | research, I realized what the chapter on memory allocation in |
---|
324 | <I>Modern C++ Design</I> should have looked like.</P> |
---|
325 | <P>But before we delve into the fascinating topic of configurable |
---|
326 | memory allocation, let's tie a few knots with past comments received |
---|
327 | via e-mail.</P> |
---|
328 | <H3>Mailcontainer</H3> |
---|
329 | <P>I wrote the sidebar "Memory: More Than Just Any Resource" in the |
---|
330 | last Generic<Programming> installment with the serene |
---|
331 | resignation with which Galileo Galilei must have said his famous |
---|
332 | "Eppur si muove." "And yet, garbage is collectable," I mumbled into |
---|
333 | my three-days beard when submitting the article for publication. The |
---|
334 | expected outcome was that the opponents of garbage collection would |
---|
335 | exemplarily mortify me via an endless flow of angry e-mails. |
---|
336 | However, they must've chosen instead to boycott me, because I |
---|
337 | haven't gotten a single response in protest.</P> |
---|
338 | <P>Ivan Godard sent me an e-mail on the subject of Observers [3, 4]. |
---|
339 | That message was so smart, and had me look up words in the |
---|
340 | dictionary so often, that I've decided to quote it almost in |
---|
341 | entirety, at the risk of blowing up the size of this article:</P> |
---|
342 | <BLOCKQUOTE>Your difficulties with <B>attach</B> and <B>detach</B> |
---|
343 | while in the middle of notification are canonical concurrency |
---|
344 | problems, and can be dealt with in the usual way. The (only |
---|
345 | reasonable?) semantics for Observer is to see <B>subject</B>, |
---|
346 | <B>observer</B>, and <B>event</B> as three independent and |
---|
347 | asynchronous processes, with a time stream localized at |
---|
348 | <B>subject</B>. That is, an <B>observer</B> cannot directly |
---|
349 | determine the time relation between its attempt to attach and the |
---|
350 | occurrence of a particular event because the event is not within |
---|
351 | the observer's horizon. Only the <B>subject</B>, which receives |
---|
352 | both events and requests to <B>attach</B>, can time-order |
---|
353 | these.<BR><BR>Consequently a putative observer will see some |
---|
354 | sequence of events that (in the subject's time frame) begins some |
---|
355 | time after the attempt to attach and ends some time after the |
---|
356 | attempt to detach. The sequence is guaranteed to be ordered (in |
---|
357 | subject time) and dense, but where it starts and where it ends is |
---|
358 | not known. Of course, if the observer is itself a source of events |
---|
359 | and the channel between observer and subject is order-preserving, |
---|
360 | then the observer can enforce somewhat more stringent bounds on |
---|
361 | how far the observed sequence extends into the subject's past or |
---|
362 | subject's future by injecting an event just before the attach or |
---|
363 | just after the detach.<BR><BR>So much for relativity theory. In |
---|
364 | practice, this implements naturally by considering the attempt to |
---|
365 | attach and the attempt to detach as being themselves events. The |
---|
366 | subject enqueues an event (including an <B>attach</B>/ |
---|
367 | <B>detach</B>) on an action list, and walks the list of observers |
---|
368 | applying each event in turn to each observer. Both observers and |
---|
369 | events are timestamped; a simple counter will do. Events are |
---|
370 | discarded when there are no observers with lesser stamps. The |
---|
371 | observer list is preceded by an observer (the subject itself) that |
---|
372 | is watching for attach events and that adds the observer to the |
---|
373 | observer list. All observers are watching for their own detach |
---|
374 | events and remove themselves when the subject applies the |
---|
375 | corresponding detach event. [...]<BR><BR>Most of the difficulties |
---|
376 | you encountered appear to be a consequence of the assumption that |
---|
377 | attach and detach were somehow global and absolute, rather than |
---|
378 | just another event in the sequence of events encountered by the |
---|
379 | subject. Remove that mistaken idea and your invalidated-iterators |
---|
380 | problems disappear.<BR></BLOCKQUOTE> |
---|
381 | <P>This view of attachment and detachment as simple events is very |
---|
382 | interesting. This generalization would, however, make it harder to |
---|
383 | define policies that lead to the simple implementations in the |
---|
384 | article. Let's admit, such simple solutions are widely used and have |
---|
385 | their place in spite of their risks and limitations. If anyone would |
---|
386 | like to embark on defining a policy-based design for such a |
---|
387 | "relativistic" Observer, and if the design does allow efficient |
---|
388 | simple implementations as well, I'd be highly interested. Contact |
---|
389 | Ivan at igodard@pacbell.net with questions.</P> |
---|
390 | <P>Brian Wood comments on the "Walking Down Memory Lane" |
---|
391 | article:</P> |
---|
392 | <BLOCKQUOTE>While you introduce <B>auto_vector</B>, you didn't |
---|
393 | mention either of the <B>ptr_vector</B> implementations. Thorsten |
---|
394 | Ottosen has written an interesting article about <B>ptr_vector</B> |
---|
395 | in the October 2005 issue of <I>Dr. Dobb's Journal</I>. |
---|
396 | <B>auto_vector</B> and the <B>ptr_vector</B> by Ottosen are |
---|
397 | obviously closely related, but also have differences. Some mention |
---|
398 | to <B>ptr_vector</B> and the differences would have been helpful, |
---|
399 | I think.<BR><BR>Anyway, from my own experience, I agree with you |
---|
400 | that things like <B>auto_vector</B> and <B>ptr_vector</B> are |
---|
401 | often preferable to <B>vector<shared_ptr<T> |
---|
402 | ></B>.<BR></BLOCKQUOTE> |
---|
403 | <P>Great, thanks Brianand readership, consider yourself tipped on |
---|
404 | where to look for more material related to scoped memory |
---|
405 | management.</P> |
---|
406 | <H3>Memory Allocation: One Size Doesn't Fit ll</H3> |
---|
407 | <P>Today's general-purpose memory allocators have reached reasonable |
---|
408 | speed and low fragmentation for a large category of programs. |
---|
409 | However, in the memory-allocation realm, a little information can go |
---|
410 | a long way. Application-specific information about allocation |
---|
411 | patterns helps to implement specialized memory allocators that |
---|
412 | heavily improve the bottom line of many high-performance |
---|
413 | applications. Sometimes, as little intel as "Blocks of size 80 are |
---|
414 | allocated more often than blocks of all other sizes," when properly |
---|
415 | used (as we'll discuss soon), can incredibly improve the bottom-line |
---|
416 | runtime of a program. (Caveat: Sometimes customized allocators are |
---|
417 | no better, and can be worse, than general-purpose allocatorssee the |
---|
418 | paper "Reconsidering Custom Memory Allocation" [7] for more |
---|
419 | details.) While general-purpose allocators have average overheads in |
---|
420 | the hundreds of cycles, a good customized memory allocator can |
---|
421 | require as few as half a dozen cycles.</P> |
---|
422 | <P>That's why many high-profile, high-performance applications (GCC, |
---|
423 | Apache, and Microsoft's SQL Server to name just a few) implement |
---|
424 | their own memory allocator. A good idea, then, is to generalize such |
---|
425 | good specialized allocators and put them in a library. But |
---|
426 | "generalization" and "specialization" are in tension: Your |
---|
427 | application might have different allocation patterns that would |
---|
428 | require yet another behavior from your allocator. What to do?</P> |
---|
429 | <P>But wait, there's more. If we do devise a method to easily create |
---|
430 | special-purpose memory allocators, we can go full-circle and define |
---|
431 | a general-purpose allocator as a combination of wisely chosen |
---|
432 | special-purpose allocators. If the resulting general-purpose |
---|
433 | allocator compares favorably with the existing monolithic |
---|
434 | general-purpose allocators, then the design is valid and useful.</P> |
---|
435 | <P>Emery's team worked towards that idea, leading to their library |
---|
436 | HeapLayers (http://heaplayers.org/). To define configurable |
---|
437 | allocators, they used mixins (also known as Coplien's curiously |
---|
438 | recurring pattern in the C++ community): defining classes with a |
---|
439 | parameterized base. Each layer defines only two member functions, |
---|
440 | <B>malloc</B> and <B>free</B>:</P><PRE>template <class T> |
---|
441 | struct Allocator : public T { |
---|
442 | void * malloc(size_t sz); |
---|
443 | void free(void* p); |
---|
444 | // system-dependent value |
---|
445 | enum { Alignment = sizeof(double) }; |
---|
446 | // optional interface |
---|
447 | size_t getSize(const void* p); |
---|
448 | }; |
---|
449 | |
---|
450 | </PRE> |
---|
451 | <P>Each layer implementation would get a crack on allocation and |
---|
452 | deallocation, possibly (and likely) requesting memory from its base |
---|
453 | class. A self-contained allocator sits at the very top of the |
---|
454 | hierarchyone that forwards requests straight to the system's |
---|
455 | <B>new</B> and <B>delete</B> operators, <B>malloc</B> and |
---|
456 | <B>free</B> functions, and the such. In HeapLayers terminology, |
---|
457 | these are the top heaps. To exemplify (careful with the |
---|
458 | qualifications so we don't enter infinite recursion):</P><PRE>struct MallocHeap { |
---|
459 | void * malloc(size_t sz) { |
---|
460 | return std::malloc(sz); |
---|
461 | } |
---|
462 | void free(void* p) { |
---|
463 | return std::free(p); |
---|
464 | } |
---|
465 | }; |
---|
466 | |
---|
467 | </PRE> |
---|
468 | <P>Top heaps can also be implemented around system calls for getting |
---|
469 | memory, such as UNIX's <B>sbrk</B> or <B>mmap</B>. This is necessary |
---|
470 | when you're completely replacing <B>malloc</B> and friends.</P> |
---|
471 | <P>The <B>getSize</B> function has a special status. Not everybody |
---|
472 | is going to need it, so defining it is optional (if you combine the |
---|
473 | wrong layers, the compiler will tell you). If it does, all you have |
---|
474 | to do is insert a layer that stores the block size and offers the |
---|
475 | <B>getSize</B> primitive; see <A |
---|
476 | href="http://devnet.developerpipeline.com/documents/s=9843/q=1/cuj0512alexandrescu/0512alexandrescul1.html" |
---|
477 | target=_BLANK>Listing 1</A>.</P> |
---|
478 | <P><B>SizeHeap</B> is the perfect illustration of how to implement a |
---|
479 | useful layer that hooks into its base's <B>malloc</B> and |
---|
480 | <B>free</B> functions, does something extra, and returns "doctored" |
---|
481 | results to the client. <B>SizeHeap</B> does its work by allocating |
---|
482 | extra memory to store the block size, with the appropriate cautions |
---|
483 | (the union) to stay as immune as possible to the alignment issue. |
---|
484 | The client gets access to the memory right next to that extra data. |
---|
485 | It's not hard to imagine building a debug heap that pads the memory |
---|
486 | block before and after with some bytes filled with a particular |
---|
487 | pattern, and then verify for overruns by checking whether the |
---|
488 | pattern has been preserved. In fact, that's exactly what HeapLayers' |
---|
489 | <B>DebugHeap</B> layer does. Pretty neat.</P> |
---|
490 | <P>But wait, something's suboptimal here. Some systems already offer |
---|
491 | a primitive to compute the size of a <B>malloc</B>ated block. On |
---|
492 | those systems, <B>SizeHeap</B> would actually waste space. In that |
---|
493 | case (for example, on Microsoft Visual C++), you wouldn't need |
---|
494 | <B>SizeHeap</B> in conjunction with <B>MallocHeap</B>, because |
---|
495 | <B>MallocHeap</B> would implement <B>getSize</B> out of the box:</P><PRE>struct MallocHeap { |
---|
496 | ... as above ... |
---|
497 | size_t getSize(void* p) { |
---|
498 | return _msize(p); |
---|
499 | } |
---|
500 | }; |
---|
501 | |
---|
502 | </PRE> |
---|
503 | <P>But wait, something's still suboptimal here. Remember, we're |
---|
504 | counting cycles. What if a system's <B>malloc</B> documentation |
---|
505 | states that the block size is stored in a word prior to the actual |
---|
506 | block? In that case, <B>SizeHeap</B> would still waste memory by |
---|
507 | storing yet another word next to the one already planted by the |
---|
508 | system. What's needed is a layer that implements <B>getSize</B> just |
---|
509 | the way <B>SizeHeap</B> does, but doesn't hook <B>malloc</B> and |
---|
510 | <B>free</B>. That's why <B>HeapLayers</B> segregates the previously |
---|
511 | shown <B>SizeHeap</B> in two; see <A |
---|
512 | href="http://devnet.developerpipeline.com/documents/s=9843/q=1/cuj0512alexandrescu/0512alexandrescul2.html" |
---|
513 | target=_BLANK>Listing 2</A>.</P> |
---|
514 | <P>Now <B>SizeHeap</B> always (correctly) adds the |
---|
515 | <B>UseSizeHeap</B> layer and exploits its <B>getSize</B> |
---|
516 | implementation, while <B>UseSizeHeap</B> can also be used in other |
---|
517 | configurationsa very elegant design.</P> |
---|
518 | <H3>A Useful Example: FreelistHeap</H3> |
---|
519 | <P>Let's face it, so far we have kind of set up the stage. We do |
---|
520 | have an architecture, but no clue on how to write an efficient |
---|
521 | specialized allocator using layers. A popular and "most bang for the |
---|
522 | buck" strategy is the following:</P> |
---|
523 | <OL> |
---|
524 | <LI>Collect stats about your application's allocation counts for |
---|
525 | each size. |
---|
526 | <LI>For the most often asked size (call it <B>S</B>), maintain a |
---|
527 | private, singly linked list. |
---|
528 | <LI>Memory allocations for <B>S</B> return memory from that list |
---|
529 | if possible, or else from the default allocator (in a layered |
---|
530 | architecture, from the superior layer). |
---|
531 | <LI>Memory deallocations for blocks of size <B>S</B> push the |
---|
532 | block into the list. </LI></OL> |
---|
533 | <P>A refinement of the strategy would be to use the same free list |
---|
534 | for a range of sizes <B>S1</B> to <B>S2</B>, at the cost of some |
---|
535 | slack memory. The needed singly linked list operations are |
---|
536 | <B>O(1)</B> and actually only a few instructions. In addition, the |
---|
537 | pointer to the next item can be stored in the actual block (the |
---|
538 | block stores no useful datait's always a freed block!) so there's |
---|
539 | no extra memory required per block. Given that most applications' |
---|
540 | allocation size distribution is highly skewed, free lists are any |
---|
541 | allocator implementer's indispensable utensil.</P> |
---|
542 | <P>Let's implement a layer that implements a free list for a range |
---|
543 | of statically known sizes <B>S1</B> to <B>S2</B>; see <A |
---|
544 | href="http://devnet.developerpipeline.com/documents/s=9843/q=1/cuj0512alexandrescu/0512alexandrescul3.html" |
---|
545 | target=_BLANK>Listing 3</A>.</P> |
---|
546 | <P>Now you can define a custom heap like this:</P><PRE>typedef FLHeap< |
---|
547 | SizeHeap<MallocHeap>, |
---|
548 | 24, |
---|
549 | 32> |
---|
550 | SmartoHeapo; |
---|
551 | |
---|
552 | </PRE> |
---|
553 | <P><B>SmartoHeapo</B> will be superfast for allocation sizes between |
---|
554 | 24 and 32, and pretty much the same for all other sizes.</P> |
---|
555 | <H3>In-Place Resizing</H3> |
---|
556 | <P>Many a C++ programmer has been dreaming for a standard primitive |
---|
557 | to reallocate memory in place. You see, C has <B>realloc</B>, which |
---|
558 | can do in-place reallocation if possible, or use <B>memcpy</B> when |
---|
559 | it comes about copying data around. But <B>memcpy</B> doesn't work |
---|
560 | for C++ objects, so <B>realloc</B> doesn't work for C++ objects,; |
---|
561 | therefore, any sort of renew primitive can't be implemented using |
---|
562 | the Standard C allocator. So C++ doesn't have renew [1].</P> |
---|
563 | <P>To give you an idea of the improvements that in-place |
---|
564 | reallocation can bring to C++ code, consider:</P><PRE>const int n = 10000; |
---|
565 | Vec v; |
---|
566 | for (int i = 0; i < n; ++i) |
---|
567 | v.push_back(0); |
---|
568 | |
---|
569 | </PRE> |
---|
570 | <P>Howard Hinnant of Metrowerks has been working on implementing |
---|
571 | in-place expansion for CodeWarrior's Standard Library |
---|
572 | implementation. In Howard's own words:</P> |
---|
573 | <BLOCKQUOTE>I currently have a <B>vector<T, |
---|
574 | malloc_allocator<T> ></B> that does [...] expand-in-place |
---|
575 | based on N1085 [8]. It blows the doors off a built-in C-like |
---|
576 | array! :-) When <B>Vec</B> is a <B>vector<int></B> without |
---|
577 | expand-in-place: <PRE>0.00095674 seconds</PRE>When <B>Vec</B> is a |
---|
578 | <B>vector<int></B> with expand-in-place: <PRE>0.000416943 seconds</PRE>The timings should only be trusted |
---|
579 | to two significant digits. But rest assured, I've done the work to |
---|
580 | secure those two digits. We are not looking at an anomaly here. |
---|
581 | </BLOCKQUOTE><PRE></PRE> |
---|
582 | <P>Given the benefits of in-place resizing and that each heap layer |
---|
583 | has control over its own allocation algorithms and data structures, |
---|
584 | let's augment the heap-layer interface:</P><PRE>template <class T> |
---|
585 | struct Allocator : public T { |
---|
586 | void * malloc(size_t sz); |
---|
587 | void free(void* p); |
---|
588 | size_t expand(void* p, size_t min, size_t max); |
---|
589 | }; |
---|
590 | |
---|
591 | </PRE> |
---|
592 | <P>The semantics of expand is, try to expand the block pointed to by |
---|
593 | <B>p</B> to the largest size possible between <B>min</B> and |
---|
594 | <B>max</B>. Then return whatever size you could expand the memory |
---|
595 | to, or zero if no expansion was possible. Fortunately, things can be |
---|
596 | arranged such that a layer doesn't have to fuss about the expand |
---|
597 | routine unless it wants to. That works if all top allocators inherit |
---|
598 | the following little class:</P><PRE>struct TopHeap { |
---|
599 | size_t expand(void*, size_t, size_t) { |
---|
600 | return 0; |
---|
601 | } |
---|
602 | // not intended for standalone usage |
---|
603 | protected: |
---|
604 | ~TopHeap() {} |
---|
605 | }; |
---|
606 | |
---|
607 | </PRE> |
---|
608 | <H3>Conclusion</H3> |
---|
609 | <P>Configurable memory allocation is, as Emery's research has shown, |
---|
610 | a practical, all-in-one alternative to both specialized and |
---|
611 | general-purpose allocators. Emery's numbers (refer to the paper [6] |
---|
612 | for details) consistently show that allocators created with |
---|
613 | HeapLayers perform just as well as, or better than, monolithic |
---|
614 | allocators, be they general-purpose or specialized. Moreover, |
---|
615 | HeapLayers' layered architecture encourages easier experimentation, |
---|
616 | simpler debugging, and unparalleled extensibility. Instead of being |
---|
617 | an oddball chapter of <I>Modern C++ Design</I>, memory allocation |
---|
618 | should have been one of the best success stories of policy-based |
---|
619 | design.</P> |
---|
620 | <P><A |
---|
621 | href="http://devnet.developerpipeline.com/documents/s=9843/q=1/cuj0512alexandrescu/0512alexandrescut1.html" |
---|
622 | target=_BLANK>Table 1</A> shows a relevant subset of the layers |
---|
623 | implemented in HeapLayers. There would be a lot of goodies to |
---|
624 | discuss, such as the locked heaps for multithreaded operations, the |
---|
625 | STL adapter, the various utility heaps, or how the layers can be |
---|
626 | combined to create a general-purpose allocator. But conventional |
---|
627 | wisdom warns us that "The mind can only enjoy what the butt can |
---|
628 | endure," so it's about time to shut downwithout forgetting to |
---|
629 | release the memory in destructors. Happy coding.</P> |
---|
630 | <H3>References</H3> |
---|
631 | <OL> |
---|
632 | <LI>Alexandrescu, Andrei. "Generic<Programming>: Typed |
---|
633 | Buffers (III)," <I>C++ Experts Online</I>, December 2001. |
---|
634 | Available at http://erdani.org/ publications/cuj-12-2001.html. |
---|
635 | <LI>Alexandrescu, Andrei. <I>Modern C++ Design</I>, Addison-Wesley |
---|
636 | Longman, 2001. |
---|
637 | <LI>Alexandrescu, Andrei. "Generic<Programming>: Prying |
---|
638 | Eyes: A Policy-Based Observer (I)," <I>C++ Users Journal</I>, |
---|
639 | April 2005. |
---|
640 | <LI>Alexandrescu, Andrei. "Generic<Programming>: Prying |
---|
641 | Eyes: A Policy-Based Observer (II)," <I>C++ Users Journal</I>, |
---|
642 | June 2005. |
---|
643 | <LI>Berger, Emery D., Kathryn S. McKinley, Robert D. Blumofe, and |
---|
644 | Paul R. Wilson. "Hoard: A scalable memory allocator for |
---|
645 | multithreaded applications. In International Conference on |
---|
646 | Architectural Support for Programming Languages and Operating |
---|
647 | Systems (ASPLOS-IX), pp. 117-128. Cambridge, MA, November 2000; |
---|
648 | http://citeseer.ist.psu.edu/berger00hoard.html. |
---|
649 | <LI>Berger, Emery D., Benjamin G. Zorn, and Kathryn S. McKinley. |
---|
650 | "Composing High-Performance Memory Allocators," in SIGPLAN |
---|
651 | Conference on Programming Language Design and Implementation, pp. |
---|
652 | 114-124, 2001; http://citeseer.ist.psu.edu/berger01composing.html. |
---|
653 | |
---|
654 | <LI>Berger, Emery D., Benjamin G. Zorn, and Kathryn S. McKinley. |
---|
655 | "Reconsidering custom memory allocation," in Proceedings of the |
---|
656 | Conference on Object-Oriented Programming Systems, Languages, and |
---|
657 | Applications (OOPSLA) 2002. Seattle, Washington, November 2002; |
---|
658 | http://citeseer.ist.psu.edu/berger02reconsidering.html. |
---|
659 | <LI>Hinnant, Howard. Proposal to augment the interface of |
---|
660 | malloc/free/realloc/calloc. See |
---|
661 | http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1085.htm.</LI></OL> |
---|
662 | <H5>CUJ</H5> |
---|
663 | <P> </P> |
---|
664 | <TABLE cellSpacing=1 cellPadding=5 width="100%" bgColor=#000000 |
---|
665 | border=0> |
---|
666 | <TBODY> |
---|
667 | <TR vAlign=top bgColor=#ffffff> |
---|
668 | <TD width="50%"><!-- -------------------- BEGIN Forum --><A |
---|
669 | class=header name=forum>From our C Discussion Forum</A><BR><A |
---|
670 | href="http://devnet.developerpipeline.com/forums/thread.html?forumid=64&threadid=23245">Serial |
---|
671 | USB support and code</A><BR><!MESSAGE!><BR><A |
---|
672 | href="http://devnet.developerpipeline.com/forums/thread.html?forumid=64&threadid=23242">ATA |
---|
673 | PC Card Identify Drive</A><BR><!MESSAGE!><BR><A |
---|
674 | href="http://devnet.developerpipeline.com/forums/thread.html?forumid=64&threadid=23239">need |
---|
675 | Mathematic lib source code </A><BR><!MESSAGE!><BR><A |
---|
676 | href="http://devnet.developerpipeline.com/forums/forum.html?forumid=64">Visit |
---|
677 | the C Forum</A> <!-- -------------------- END Forum --></TD> |
---|
678 | <TD width="50%"><A class=header>C++ related Articles</A> |
---|
679 | <BR><B><A |
---|
680 | href="http://devnet.developerpipeline.com/documents/s=9843/q=1/ddj050820pc/ddj050820pc.mp3">Eclipse |
---|
681 | CDT 3.0 Released</A></B><BR><BR></TD></TR></TBODY></TABLE></TD><!-- divider columns --></TR> |
---|
682 | <TR> |
---|
683 | <TD vAlign=top align=left height=10><IMG height=10 hspace=0 |
---|
684 | src="heaplayers-article-cuj_files/blank.gif" width=770 |
---|
685 | border=0></TD></TR></TBODY></TABLE><!-- END MAIN CONTENT TABLE --><!-- BOTTOM NAVIGATION --> |
---|
686 | <TABLE cellSpacing=0 cellPadding=0 width=770 bgColor=#ffffff border=0 |
---|
687 | table_name="footerTable"> |
---|
688 | <TBODY> |
---|
689 | <TR> |
---|
690 | <TD align=middle bgColor=#999999><IMG height=2 hspace=0 |
---|
691 | src="heaplayers-article-cuj_files/blank.gif" width=770 |
---|
692 | border=0></TD></TR> |
---|
693 | <TR> |
---|
694 | <TD> |
---|
695 | <DIV class=BOTnav><A class=blacknavigation |
---|
696 | href="http://www.developerpipeline.comnews/">News</A> <IMG height=11 |
---|
697 | hspace=5 src="heaplayers-article-cuj_files/orangeline.gif" width=2 |
---|
698 | border=0 valign="absbottom"> <A class=blacknavigation |
---|
699 | href="http://www.developerpipeline.com/trends">Trends</A> <IMG |
---|
700 | height=11 hspace=5 src="heaplayers-article-cuj_files/orangeline.gif" |
---|
701 | width=2 border=0 valign="absbottom"> <A class=blacknavigation |
---|
702 | href="http://productfinder.developerpipeline.com/">Product |
---|
703 | Finder</A> <IMG height=11 hspace=5 |
---|
704 | src="heaplayers-article-cuj_files/orangeline.gif" width=2 border=0 |
---|
705 | valign="absbottom"> <A class=blacknavigation |
---|
706 | href="http://www.developerpipeline.com/howto">How-To</A> <IMG |
---|
707 | height=11 hspace=5 src="heaplayers-article-cuj_files/orangeline.gif" |
---|
708 | width=2 border=0 valign="absbottom"> <A class=blacknavigation |
---|
709 | href="http://www.developerpipeline.com/coding">Coding & |
---|
710 | Scripting</A> <IMG height=11 hspace=5 |
---|
711 | src="heaplayers-article-cuj_files/orangeline.gif" width=2 border=0 |
---|
712 | valign="absbottom"> <A class=blacknavigation |
---|
713 | href="http://www.developerpipeline.com/design">Design & |
---|
714 | Process</A> <IMG height=11 hspace=5 |
---|
715 | src="heaplayers-article-cuj_files/orangeline.gif" width=2 border=0 |
---|
716 | valign="absbottom"> <A class=blacknavigation |
---|
717 | href="http://www.developerpipeline.com/tools">Tools</A> <IMG |
---|
718 | height=11 hspace=5 src="heaplayers-article-cuj_files/orangeline.gif" |
---|
719 | width=2 border=0 valign="absbottom"> <A class=blacknavigation |
---|
720 | href="http://www.developerpipeline.com/business">Business & |
---|
721 | Careers</A> <BR><A class=blacknavigation |
---|
722 | href="http://www.developerpipeline.com/newsletter.jhtml">Free |
---|
723 | Newsletters</A> <IMG height=11 hspace=5 |
---|
724 | src="heaplayers-article-cuj_files/orangeline.gif" width=2 border=0 |
---|
725 | valign="absbottom"> <A class=blacknavigation |
---|
726 | href="http://www.developerpipeline.com/glossary.jhtml">Developer |
---|
727 | Glossary</A> <IMG height=11 hspace=5 |
---|
728 | src="heaplayers-article-cuj_files/orangeline.gif" width=2 border=0 |
---|
729 | valign="absbottom"> <A class=blacknavigation |
---|
730 | href="http://www.developerpipeline.com/contact.jhtml">Contact Us</A> |
---|
731 | <IMG height=11 hspace=5 |
---|
732 | src="heaplayers-article-cuj_files/orangeline.gif" width=2 border=0 |
---|
733 | valign="absbottom"> <A class=blacknavigation |
---|
734 | href="http://www.developerpipeline.com/about.jhtml">About Us</A> |
---|
735 | <IMG height=11 hspace=5 |
---|
736 | src="heaplayers-article-cuj_files/orangeline.gif" width=2 border=0 |
---|
737 | valign="absbottom"> <A class=blacknavigation |
---|
738 | href="http://www.cmp.com/delivery/privacy.html">Privacy</A> <IMG |
---|
739 | height=11 hspace=5 src="heaplayers-article-cuj_files/orangeline.gif" |
---|
740 | width=2 border=0 valign="absbottom"> <A class=blacknavigation |
---|
741 | href="http://www.cmp.com/delivery/privacy.html#california">Your |
---|
742 | California Privacy Rights</A> </DIV></TD></TR> |
---|
743 | <TR> |
---|
744 | <TD align=middle bgColor=#999999><IMG height=1 hspace=0 |
---|
745 | src="heaplayers-article-cuj_files/blank.gif" width=770 |
---|
746 | border=0></TD></TR> |
---|
747 | <TR> |
---|
748 | <TD><!-- indusrty brains table --> |
---|
749 | <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> |
---|
750 | <TBODY> |
---|
751 | <TR> |
---|
752 | <TD vAlign=center align=middle><BR><BR><!-- indusrty brains --><SPAN |
---|
753 | id=nointelliTXT> |
---|
754 | <TABLE cellSpacing=2 cellPadding=0 width="90%" bgColor=#223378 |
---|
755 | border=0> |
---|
756 | <TBODY> |
---|
757 | <TR> |
---|
758 | <TD> |
---|
759 | <TABLE class=txtBlk_small cellSpacing=0 cellPadding=5 |
---|
760 | width="100%" bgColor=#efefef border=0> |
---|
761 | <TBODY> |
---|
762 | <TR> |
---|
763 | <TD> |
---|
764 | <DIV align=center><SPAN |
---|
765 | class=txtBlk_small><B>MarketPlace</B></SPAN></DIV><BR> |
---|
766 | <DIV align=center><A |
---|
767 | href="http://www.industrybrains.com/cmpsd">Wanna |
---|
768 | see your ad |
---|
769 | here?</A></DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></SPAN><!-- end IB --></TD></TR></TBODY></TABLE><BR><!-- end indusrty brains table--> |
---|
770 | <DIV class=BOTnav><A class=orange11 |
---|
771 | href="http://www.internetweek.com/"></A>Developer Network Websites: |
---|
772 | <A class=orange11 href="http://www.byte.com/" |
---|
773 | target=_blank>BYTE.com</A>, <A class=orange11 |
---|
774 | href="http://www.cuj.com/" target=_blank>C/C++ Users Journal</A>, <A |
---|
775 | class=orange11 href="http://developerpipeline.com/" |
---|
776 | target=_blank>Developer Pipeline</A>, <A class=orange11 |
---|
777 | href="http://www.ddj.com/" target=_blank>Dr. Dobb's Journal</A>, <A |
---|
778 | class=orange11 href="http://www.dotnetjunkies.com/" |
---|
779 | target=_blank>DotNetJunkies</A>, <A class=orange11 |
---|
780 | href="http://msdn.microsoft.com/msdnmag/" target=_blank>MSDN |
---|
781 | Magazine</A>, <A class=orange11 href="http://www.samag.com/" |
---|
782 | target=_blank>Sys Admin</A>, <A class=orange11 |
---|
783 | href="http://www.sdexpo.com/" target=_blank>SD Expo</A>, <A |
---|
784 | class=orange11 href="http://www.sdmagazine.com/" |
---|
785 | target=_blank>Software Development Magazine</A>, <A class=orange11 |
---|
786 | href="http://www.sqljunkies.com/" target=_blank>SqlJunkies</A>, <A |
---|
787 | class=orange11 href="http://www.unixreview.com/" |
---|
788 | target=_blank>Unixreview</A>, <A class=orange11 |
---|
789 | href="http://www.windevnet.com/" target=_blank>Windows Developer |
---|
790 | Network</A>, <A class=orange11 |
---|
791 | href="http://www.newarchitectmag.com/" target=_blank>New |
---|
792 | Architect</A> </DIV></TD></TR> |
---|
793 | <TR> |
---|
794 | <TD align=middle bgColor=#cccccc> |
---|
795 | <DIV class=BOTnavgrey><SPAN class=grey9><A class=grey9 |
---|
796 | href="http://www.cmp.com/delivery/copyright.html">Copyright</A> © |
---|
797 | 2005<A class=grey9 href="http://www.cmp.com/">CMP Media LLC.</A> | |
---|
798 | DEVELOPER PIPELINE All rights reserved. <A class=grey9 |
---|
799 | href="http://www.cmp.com/delivery/privacy.html">Privacy Policy</A> | |
---|
800 | <A href="http://www.cmp.com/delivery/privacy.html#california">Your |
---|
801 | California Privacy Rights</A> | <A class=grey9 |
---|
802 | href="http://www.cmp.com/delivery/terms.html">Terms of Service</A> |
---|
803 | </SPAN></DIV></TD></TR> |
---|
804 | <TR> |
---|
805 | <TD align=middle bgColor=#e7e7e7><IMG height=2 hspace=0 |
---|
806 | src="heaplayers-article-cuj_files/blank.gif" width=770 |
---|
807 | border=0></TD></TR></TBODY></TABLE><!-- END BOTTOM NAVIGATION --><!-- bottom ad --> |
---|
808 | <DIV align=center><BR><BR><!-- AD: 'http://localhost:8085/html.ng/site=sdmg&affiliate=sdmgdeveloperpipeline&pagepos=bottom&catid=&site_section=9843&articleid=141768&target=cpp&country=&state=' --><!-- Sniffer Code for Flash version=60 --> |
---|
809 | <SCRIPT language=JavaScript> |
---|
810 | <!-- |
---|
811 | var swf_click = "http://as.cmpnet.com/event.ng/Type=click&FlightID=45538&AdID=80366&TargetID=4721&Segments=1411,3108,3448,4875,5818,5864&Targets=2625,2878,4666,4721&Values=34,46,51,63,77,83,90,100,140,204,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/"; |
---|
812 | var dcswf_click = escape(swf_click); |
---|
813 | var ShockMode = 0; |
---|
814 | var plugin = (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"]) ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0; |
---|
815 | |
---|
816 | if (plugin && parseInt(plugin.description.substring(plugin.description.indexOf(".")-1)) >= 6) |
---|
817 | { |
---|
818 | ShockMode = 1; |
---|
819 | } |
---|
820 | else if (navigator.userAgent && navigator.userAgent.indexOf("MSIE")>=0 |
---|
821 | && (navigator.userAgent.indexOf("Windows 95")>=0 || navigator.userAgent.indexOf("Windows 98")>=0 || navigator.userAgent.indexOf("Windows NT")>=0)) { |
---|
822 | document.write('<SCRIPT LANGUAGE=VBScript\> \n'); |
---|
823 | document.write('on error resume next \n'); |
---|
824 | document.write('ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.6")))\n'); |
---|
825 | document.write('<\/SCRIPT\> \n'); |
---|
826 | } |
---|
827 | if ( ShockMode ) { |
---|
828 | document.write('<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'); |
---|
829 | document.write(' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"'); |
---|
830 | document.write(' ID=flashad WIDTH=728 HEIGHT=90>'); |
---|
831 | document.write(' <PARAM NAME=movie VALUE="http://i.cmpnet.com/ads/graphics/as5/cc/flash/banner_728x90c_1209.swf?clickTag='+dcswf_click+'"> '); |
---|
832 | document.write(' <PARAM NAME=quality VALUE=high> '); |
---|
833 | document.write(' <PARAM NAME=wmode VALUE=opaque> '); |
---|
834 | document.write(' <EMBED SRC="http://i.cmpnet.com/ads/graphics/as5/cc/flash/banner_728x90c_1209.swf?clickTag='+dcswf_click+'" QUALITY=high WMODE=opaque '); |
---|
835 | document.write(' NAME=flashad swLiveConnect=TRUE WIDTH=728 HEIGHT=90'); |
---|
836 | document.write(' TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">'); |
---|
837 | document.write('</EMBED>'); |
---|
838 | document.write('</OBJECT>'); |
---|
839 | } else if (!(navigator.appName && navigator.appName.indexOf("Netscape")>=0 && navigator.appVersion.indexOf("2.")>=0)){ |
---|
840 | document.write('<A HREF="http://as.cmpnet.com/event.ng/Type=click&FlightID=45538&AdID=80366&TargetID=4721&Segments=1411,3108,3448,4875,5818,5864&Targets=2625,2878,4666,4721&Values=34,46,51,63,77,83,90,100,140,204,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/" target="_top"><IMG SRC="http://i.cmpnet.com/ads/graphics/as5/cc/banner_728x90c.gif" WIDTH=728 HEIGHT=90 BORDER=0></A>'); |
---|
841 | } |
---|
842 | //--> |
---|
843 | </SCRIPT> |
---|
844 | <NOEMBED><A |
---|
845 | href="http://as.cmpnet.com/event.ng/Type=click&FlightID=45538&AdID=80366&TargetID=4721&Segments=1411,3108,3448,4875,5818,5864&Targets=2625,2878,4666,4721&Values=34,46,51,63,77,83,90,100,140,204,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/" |
---|
846 | target=_top><IMG height=90 |
---|
847 | src="heaplayers-article-cuj_files/banner_728x90c.gif" width=728 |
---|
848 | border=0></A> </NOEMBED><NOSCRIPT><A |
---|
849 | href="http://as.cmpnet.com/event.ng/Type=click&FlightID=45538&AdID=80366&TargetID=4721&Segments=1411,3108,3448,4875,5818,5864&Targets=2625,2878,4666,4721&Values=34,46,51,63,77,83,90,100,140,204,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/" |
---|
850 | target=_top><IMG height=90 |
---|
851 | src="heaplayers-article-cuj_files/banner_728x90c.gif" width=728 |
---|
852 | border=0></A> </NOSCRIPT><IMG height=1 src="" width=1 border=0> </DIV><!-- end bottom ad --><BR><FONT size=-1>web2 </FONT></TD> |
---|
853 | <TD vAlign=top align=right width=170><!-- right column --> |
---|
854 | <TABLE cellSpacing=0 cellPadding=0 width=160 border=0> |
---|
855 | <TBODY> |
---|
856 | <TR> |
---|
857 | <TD><!-- streaming media --> |
---|
858 | <DIV style="MARGIN-TOP: 170px"> |
---|
859 | <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> |
---|
860 | <TBODY> |
---|
861 | <TR> |
---|
862 | <TD> |
---|
863 | <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> |
---|
864 | <TBODY> |
---|
865 | <TR> |
---|
866 | <TD bgColor=#cc6600> |
---|
867 | <TABLE cellSpacing=0 cellPadding=3 width="100%" |
---|
868 | border=0> |
---|
869 | <TBODY> |
---|
870 | <TR> |
---|
871 | <TD><FONT color=#ffffff><STRONG>DevNet |
---|
872 | Podcasts</STRONG></FONT> |
---|
873 | </TD></TR></TBODY></TABLE></TD></TR> |
---|
874 | <TR> |
---|
875 | <TD bgColor=#ffd673 height=2></TD></TR></TBODY></TABLE> |
---|
876 | <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> |
---|
877 | <TBODY> |
---|
878 | <TR> |
---|
879 | <TD width=1 bgColor=#999999><IMG height=1 hspace=0 |
---|
880 | src="C:\home\emery\projects\heaplayers\doc\heaplayers-article-cuj_files\blank(2).gif" |
---|
881 | width=1 border=0></TD> |
---|
882 | <TD bgColor=#ffffff> |
---|
883 | <TABLE cellSpacing=0 cellPadding=5 width="100%" |
---|
884 | border=0> |
---|
885 | <TBODY> |
---|
886 | <TR> |
---|
887 | <TD> |
---|
888 | <P><STRONG>Introducing Dobbscast Audio |
---|
889 | Blogs</STRONG></P> |
---|
890 | <P align=left><A |
---|
891 | href="http://syndication.sdmediagroup.com/feeds/public/cmp_podcast_ddj.xml">Get |
---|
892 | the Dobbscast feed<BR><IMG alt="" |
---|
893 | src="heaplayers-article-cuj_files/rss_podcast.gif" |
---|
894 | border=0></A></P></TD></TR></TBODY></TABLE></TD> |
---|
895 | <TD width=1 bgColor=#999999><IMG height=1 hspace=0 |
---|
896 | src="C:\home\emery\projects\heaplayers\doc\heaplayers-article-cuj_files\blank(2).gif" |
---|
897 | width=1 border=0></TD></TR> |
---|
898 | <TR> |
---|
899 | <TD bgColor=#999999><IMG height=1 hspace=0 |
---|
900 | src="C:\home\emery\projects\heaplayers\doc\heaplayers-article-cuj_files\blank(2).gif" |
---|
901 | width=1 border=0></TD> |
---|
902 | <TD bgColor=#999999><IMG height=1 hspace=0 |
---|
903 | src="C:\home\emery\projects\heaplayers\doc\heaplayers-article-cuj_files\blank(2).gif" |
---|
904 | width=1 border=0></TD> |
---|
905 | <TD bgColor=#999999><IMG height=1 hspace=0 |
---|
906 | src="C:\home\emery\projects\heaplayers\doc\heaplayers-article-cuj_files\blank(2).gif" |
---|
907 | width=1 |
---|
908 | border=0></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV><!-- end streaming media --><!-- skyscraper ad --><BR> |
---|
909 | <DIV align=center><!-- AD: 'http://localhost:8085/html.ng/site=sdmg&affiliate=sdmgdeveloperpipeline&pagepos=sky&catid=&site_section=9843&articleid=141768&target=cpp&country=&state=' --><!-- Sniffer Code for Flash version=60 --> |
---|
910 | <SCRIPT language=JavaScript> |
---|
911 | <!-- |
---|
912 | var swf_click = "http://as.cmpnet.com/event.ng/Type=click&FlightID=45539&AdID=80365&TargetID=4720&Segments=1411,3108,3219,3448,4875,5820,5869&Targets=2625,2781,2878,4664,4720&Values=34,46,51,63,77,83,90,100,140,206,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/products/"; |
---|
913 | var dcswf_click = escape(swf_click); |
---|
914 | var ShockMode = 0; |
---|
915 | var plugin = (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"]) ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0; |
---|
916 | |
---|
917 | if (plugin && parseInt(plugin.description.substring(plugin.description.indexOf(".")-1)) >= 6) |
---|
918 | { |
---|
919 | ShockMode = 1; |
---|
920 | } |
---|
921 | else if (navigator.userAgent && navigator.userAgent.indexOf("MSIE")>=0 |
---|
922 | && (navigator.userAgent.indexOf("Windows 95")>=0 || navigator.userAgent.indexOf("Windows 98")>=0 || navigator.userAgent.indexOf("Windows NT")>=0)) { |
---|
923 | document.write('<SCRIPT LANGUAGE=VBScript\> \n'); |
---|
924 | document.write('on error resume next \n'); |
---|
925 | document.write('ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.6")))\n'); |
---|
926 | document.write('<\/SCRIPT\> \n'); |
---|
927 | } |
---|
928 | if ( ShockMode ) { |
---|
929 | document.write('<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'); |
---|
930 | document.write(' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"'); |
---|
931 | document.write(' ID=flashad WIDTH=125 HEIGHT=600>'); |
---|
932 | document.write(' <PARAM NAME=movie VALUE="http://i.cmpnet.com/ads/graphics/as5/cc/flash/banner_125x600a_1209.swf?clickTag='+dcswf_click+'"> '); |
---|
933 | document.write(' <PARAM NAME=quality VALUE=high> '); |
---|
934 | document.write(' <PARAM NAME=wmode VALUE=opaque> '); |
---|
935 | document.write(' <EMBED SRC="http://i.cmpnet.com/ads/graphics/as5/cc/flash/banner_125x600a_1209.swf?clickTag='+dcswf_click+'" QUALITY=high WMODE=opaque '); |
---|
936 | document.write(' NAME=flashad swLiveConnect=TRUE WIDTH=125 HEIGHT=600'); |
---|
937 | document.write(' TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">'); |
---|
938 | document.write('</EMBED>'); |
---|
939 | document.write('</OBJECT>'); |
---|
940 | } else if (!(navigator.appName && navigator.appName.indexOf("Netscape")>=0 && navigator.appVersion.indexOf("2.")>=0)){ |
---|
941 | document.write('<A HREF="http://as.cmpnet.com/event.ng/Type=click&FlightID=45539&AdID=80365&TargetID=4720&Segments=1411,3108,3219,3448,4875,5820,5869&Targets=2625,2781,2878,4664,4720&Values=34,46,51,63,77,83,90,100,140,206,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/products/" target="_top"><IMG SRC="http://i.cmpnet.com/ads/graphics/as5/cc/banner_125x600a.gif" WIDTH=125 HEIGHT=600 BORDER=0></A>'); |
---|
942 | } |
---|
943 | //--> |
---|
944 | </SCRIPT> |
---|
945 | <NOEMBED><A |
---|
946 | href="http://as.cmpnet.com/event.ng/Type=click&FlightID=45539&AdID=80365&TargetID=4720&Segments=1411,3108,3219,3448,4875,5820,5869&Targets=2625,2781,2878,4664,4720&Values=34,46,51,63,77,83,90,100,140,206,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/products/" |
---|
947 | target=_top><IMG height=600 |
---|
948 | src="heaplayers-article-cuj_files/banner_125x600a.gif" width=125 |
---|
949 | border=0></A> </NOEMBED><NOSCRIPT><A |
---|
950 | href="http://as.cmpnet.com/event.ng/Type=click&FlightID=45539&AdID=80365&TargetID=4720&Segments=1411,3108,3219,3448,4875,5820,5869&Targets=2625,2781,2878,4664,4720&Values=34,46,51,63,77,83,90,100,140,206,442,645,646,657,944,945,1184,1311,1405,1412,1426,1716,1736,1767,1785,1935,1936,1944,1970,2310,2327,2352,2759,2767,2862,2878,2942,3067,3080&RawValues=&Redirect=http://www.intel.com/software/products/" |
---|
951 | target=_top><IMG height=600 |
---|
952 | src="heaplayers-article-cuj_files/banner_125x600a.gif" width=125 |
---|
953 | border=0></A> </NOSCRIPT><IMG height=1 src="" width=1 border=0> |
---|
954 | </DIV><!-- end skyscraper --></TD></TR></TBODY></TABLE><!-- end right column --></TD></TR></TBODY></TABLE></DIV></BODY></HTML> |
---|