tag:blogger.com,1999:blog-103030352024-03-07T12:02:34.300+03:00Алёна C++программирование для прагматиковAlenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.comBlogger114125tag:blogger.com,1999:blog-10303035.post-82163858025129814372015-06-29T21:39:00.000+03:002015-06-29T21:39:43.617+03:00Фрагментация памяти в C++ приложенияхПоскольку памятью в С++ приложении программист управляет самостоятельно, то и за фрагментацией памяти приходится следить самим. Память фрагментируется, если приложение работает достаточно долго и при этом активно работает с памятью. Не такая редкая проблема. Я это видела в играх, игрок бегает, юнитов убивает, локации меняет, надо под это память выделять и потом освобождать. И в высоконагруженных системах, запросы приходят, надо под них память выделять, потом освобождать. <br />
<br />
Чем это плохо? Во-первых, память может внезапно закончиться. Во-вторых может просесть производительность. Вот тут можно почитать историю как это выглядит на практике: <a href="http://nfrechette.github.io/2015/06/25/out_of_memory/?utm_content=buffer20210&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer">Out of memory</a><br />
<br />
Вот тут с картинками написано как оно происходит: <a href="http://bulldozer00.com/2015/06/01/holier-than-thou/?utm_content=buffer21145&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer">Holier Than Thou</a><br />
Но не написано - а что с этим делать-то? Итак, с чем я работала.<br />
<br />
<a href="https://en.wikipedia.org/wiki/Region-based_memory_management">Region-based memory management</a>. Выделяем память большим куском, например, под уровень в игре. Популярный термин для такого куска - "арена". Потом уже внутри этого куска создаем нужные нам объекты. Когда все это стало не нужно - весь кусок памяти освобождаем. Заодно с утечками памяти проблем меньше.<br />
Арену можно использовать вместе с STL, см. "STL custom allocators". <br />
<br />
<br />
<a href="http://theboostcpplibraries.com/boost.pool">Boost.Pool</a>. Там есть несколько разных интерфейсов, я использовала object_pool, который помогает эффективнее создавать и удалять большое количество сравнительно маленьких объектов.<br />
<br />
Также я видела разное креативное использование placement new, как правило его можно заменить Boost.Pool'ом.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com10tag:blogger.com,1999:blog-10303035.post-76418350044781697852015-05-09T01:58:00.000+03:002015-05-09T02:10:41.442+03:00Хорошие книги по С++11Я сейчас в работе активно использую фичи C++11 и C++14, чего и вам рекомендую. Вот вам отличные книги по новыму стандарту.<br />
<br />
<div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGj_T0lJs-hOS_g0Za26JK9wYhfjknve032Iqz1JVZ7fXzOVOwmoWTGXmPIZIgsEkUeDPSGvCrJE6qgH7E9hPgRUNlwsbSRMp4gib8MXIEOUE4560RUC4maxlkZHv5pCMzbcAYmQ/s1600/effectivemoderncpp.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGj_T0lJs-hOS_g0Za26JK9wYhfjknve032Iqz1JVZ7fXzOVOwmoWTGXmPIZIgsEkUeDPSGvCrJE6qgH7E9hPgRUNlwsbSRMp4gib8MXIEOUE4560RUC4maxlkZHv5pCMzbcAYmQ/s200/effectivemoderncpp.png" width="151" /></a><a href="http://www.amazon.com/gp/product/1491903996/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1491903996&linkCode=as2&tag=alec-20&linkId=A25GB3T56BHXYT3M">Effective Modern C++ : 42 Specific Ways to Improve Your Use of C++11 and C++14</a> by Scott Meyers</div>
Самая лучшая книга по C++11 и C++14. Просто, понятно с примерами. Для тех, кто знает С++ и хочет использовать фичи нового стандарта. На русский, похоже, не переведена<br />
<div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyucUBrtHyIboKvds7h_3WrcZRhFgxrB-7-aLYfGHXXXkLTZPNPjVooVVF8fMC8xXWs8DojCMToEB1LWVAH3OGXW-nZXiT4T-BjxCPYgEFlgc-g5RcMijwnf28779pMGkqJgRCwA/s1600/williams.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyucUBrtHyIboKvds7h_3WrcZRhFgxrB-7-aLYfGHXXXkLTZPNPjVooVVF8fMC8xXWs8DojCMToEB1LWVAH3OGXW-nZXiT4T-BjxCPYgEFlgc-g5RcMijwnf28779pMGkqJgRCwA/s200/williams.jpg" width="137" /></a><a href="http://www.amazon.com/gp/product/1933988770/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1933988770&linkCode=as2&tag=alec-20&linkId=2JLP2ZQKUVV6Q2QU">С++ Concurrency in Action: Practical Multithreading</a> by Anthony Williams</div>
В переводе <a href="http://www.ozon.ru/context/detail/id/26893657/?partner=alenacpp">"Параллельное программирование на С++ в действии. Практика разработки многопоточных программ"</a><br />
С фокусом на многопоточность, которой раньше в стандарте не было. Если душит жаба эту книгу покупать, то написана она на основе вот этих статьей Уильямса: <a href="https://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html#series">Multithreading in C++0x Series</a><br />
<div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP6n6SNPyLUCd3Zs4No3wKahv_Qpw4KCGYvuBd0DALXr74_mLBnSvVFU5W4d5VXR80kVnZrbkPqFZOpVlxzI5cPtG6ES8oaMQXMVn5KIY3Px-mWHJOuD65-SnaDwK9Ig0kAbUFfQ/s1600/josuttis.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP6n6SNPyLUCd3Zs4No3wKahv_Qpw4KCGYvuBd0DALXr74_mLBnSvVFU5W4d5VXR80kVnZrbkPqFZOpVlxzI5cPtG6ES8oaMQXMVn5KIY3Px-mWHJOuD65-SnaDwK9Ig0kAbUFfQ/s200/josuttis.jpg" width="136" /></a>
<a href="http://www.amazon.com/gp/product/0321623215/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321623215&linkCode=as2&tag=alec-20&linkId=6SNQA2BV3TVXZ54C">The C++ Standard Library: A Tutorial and Reference (2nd Edition)</a> by Nicolai M. Josuttis</div>
В переводе <a href="http://www.ozon.ru/context/detail/id/27978215/?partner=alenacpp">"Стандартная библиотека C++. Справочное руководство"</a><br />
Джоссатис обновил свою книгу про STL. Много букв. Очень много букв. Выискивать там куски, относящиеся именно к C++11, смысла не имеет. Многопоточность, правда, вынесена в отдельную главу, но по многопоточности лучше Уильямса почитать.<br />
Поэтому рекомендую эту книгу тем, кто решил начинать изучать STL. Обратите внимание на издание, вам нужно <b>второе</b> издание, там на обложке крупно написано С++11.<br />
Вообще это относится ко всем книгам по С++. То, что издано до 2012 года можно считать устаревшим.<br />
<br />
Про качество переводов ничего сказать не могу.<br />
<br />
Ссылки по теме:<br />
<a href="http://alenacpp.blogspot.com/2006/09/c.html">Хорошие книги по С++</a>Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com6tag:blogger.com,1999:blog-10303035.post-86107460139035867702014-11-19T02:10:00.001+03:002014-11-19T02:10:52.752+03:00Обзор книги A Tour of C++<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU0Z9M8JLSVAxGysJoDxJuZIdk653yQFcCRSPs6aEBiilpchAe1gIJmy0wOhZ0yXP7N7coC2Fuxal0DEt99boLOElf6JcpXQr6JaBQoRiS2OoAMVGpEp4Rx6X5W-F6jzXLmNviUw/s1600/41tSaOQUNRL.jpg" imageanchor="1" style="float: left; margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU0Z9M8JLSVAxGysJoDxJuZIdk653yQFcCRSPs6aEBiilpchAe1gIJmy0wOhZ0yXP7N7coC2Fuxal0DEt99boLOElf6JcpXQr6JaBQoRiS2OoAMVGpEp4Rx6X5W-F6jzXLmNviUw/s1600/41tSaOQUNRL.jpg" height="320" width="238" /></a>
Прочитала новую книгу Страуструпа "<a href="http://www.amazon.com/Tour-C--Depth/dp/0321958314">A Tour of C++</a>". Это очень краткое введение в С++11. Рекомендуется новичкам, которые уже умеют программировать на каком-то языке. Но мне такая рекомендация не нравится, потому что книга уж очень лаконичная. Она подойдет скорее человеку, который когда-то писал на С++, подзабыл, а сейчас надо срочно вспомнить и заодно понять чего нового появилось за прошедшее время.<br />
<br />
Если вы на C++ пишете все время и в курсе изменений в C++11, то ничего нового вы там не найдете.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com2tag:blogger.com,1999:blog-10303035.post-42444235950532675732012-11-21T03:34:00.001+04:002012-11-21T04:47:54.008+04:00Статья Storage Layout of Polymorphic ObjectsНачинающим С++ программистам часто бывает непонятно каким образом и где хранятся виртуальные функции. Статья <a href="http://www.drdobbs.com/cpp/storage-layout-of-polymorphic-objects/240012098">Storage Layout of Polymorphic Objects</a> рассказ в картинках о том, как будут размещены поля и виртуальные функции объекта, рекомендую.
<br><br>
via <a href="https://twitter.com/Code_Analysis">Code_Analysis</a>Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com11tag:blogger.com,1999:blog-10303035.post-19422237192541895982012-06-11T00:13:00.000+04:002012-06-18T10:12:13.542+04:00Обзор исходников Doom3Некоторое время назад исходники Doom3 были выложены в открытый доступ. Но в исходниках без доков разбираться довольно тяжело. Так вот, <a href="http://fabiensanglard.net/doom3/index.php">Фабьен Санглар написал по ним обзор</a> со схемами, картинками, видео. Также он позадавал вопросы Кармаку по исходникам. Если вы мечтаете писать игры, но не знаете с чего начать, то Фабьен сделал вам прекрасный подарок.<br />
<br />
Несколько фактов оттуда:<br />
<ul>
<li>Впервые в истории id Software код написан на С++, а не на С
</li>
<li>В коде широко используются абстракция данных и полиморфизм
</li>
<li>Темплейты используются только для низкоуровневого кода
</li>
<li>По мнению Фабьена это вторая по качеству кодобаза от id Software после <a href="http://fabiensanglard.net/doomIphone/index.php">Doom iPhone</a>
</li>
<li>Благодаря инкапсуляции код легко читать
</li>
<li>Дни оптимизации ассемблерного кода на низком уровне прошли
</li>
</ul>
Бонус: Кармак рассказывает о своих экспериментах с очками виртуальной реальности и о проблемах с задержкой отрисовки. <a href="http://kotaku.com/5916210/carmack-being-carmack-a-dozen-minutes-with-one-of-video-games-smartest-people">Carmack Being Carmack: A Dozen Minutes With One of Video Game’s Smartest People</a>Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com9tag:blogger.com,1999:blog-10303035.post-63938646176365652562012-06-04T06:47:00.000+04:002012-06-04T09:06:48.602+04:00Статья Hash Functions for C++ Unordered ContainersИ еще одна интересная проблема из переписки. С ней сталкиваются все, кто более-менее серьезно пытается использовать хэш-контейнеры в С++.
Итак, вы пытаетесь положить свой класс в, скажем, unordered_map. И получаете сообщение об ошибке примерно такого вида:<br />
<br />
<pre><code>
cannot convert from 'const Name' to 'size_t'
</code></pre>
Это крайне невразумительное сообщение об ошибке означает, что вы должны определить хэш-функцию для своего класса, чтобы можно было его использовать с данным контейнером.<br />
О том как это сделать есть хорошая подробная статья <a href="http://marknelson.us/2011/09/03/hash-functions-for-c-unordered-containers/">Hash Functions for C++ Unordered Containers.</a><br />
Пример оттуда с самым простым способом определить хэш-функцию<br />
<br />
<pre><code>
//
// This program uses a simple user-defined function
// to provide a hash function for use in unordered_map
//
// Compile this example with Visual Studio 2010
// or g++ 4.5 using -std=c++0x
//
#include <iostream>
#include <unordered_map>
#include <string>
#include <functional>
using namespace std;
typedef pair<string,string> Name;
size_t name_hash( const Name & name )
{
return hash<string>()(name.first) ^ hash<string>()(name.second);
}
int main(int argc, char* argv[])
{
unordered_map<Name,int,decltype(&name_hash)> ids(100, name_hash );
ids[Name("Mark", "Nelson")] = 40561;
ids[Name("Andrew","Binstock")] = 40562;
for ( auto ii = ids.begin() ; ii != ids.end() ; ii++ )
cout << ii->first.first
<< " "
<< ii->first.second
<< " : "
<< ii->second
<< endl;
return 0;
}
</code></pre>Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com8tag:blogger.com,1999:blog-10303035.post-32980398700110977372012-02-06T07:13:00.007+04:002012-02-06T09:53:32.501+04:00Закончилась конференция GoingNative 2012<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3NEYOIGbukVAxkUoiMsS2uUPujBp9a23ioO4l-t361OMcPBTPsDGrLPn7gvgti6yBOu1MtQQxlqDCQVFvUKjU046I6JkIRNoap50ceV0-cAyLSjfrTiB3HMzpS9TCDO8wNjELMg/s1600/welcome.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 133px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3NEYOIGbukVAxkUoiMsS2uUPujBp9a23ioO4l-t361OMcPBTPsDGrLPn7gvgti6yBOu1MtQQxlqDCQVFvUKjU046I6JkIRNoap50ceV0-cAyLSjfrTiB3HMzpS9TCDO8wNjELMg/s200/welcome.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5705889943553911186" /></a><a href="http://channel9.msdn.com/Events/GoingNative/GoingNative-2012">GoingNative 2012</a> закончилась, рассказывали там в основном про C++11. Обещали к настоящему моменту выложить записи всех докладов, но не успели, там есть только часть.<br /><br />Давайте я расскажу про те доклады, на которых я побывала, а вы уж сами решайте - смотреть вам их или нет.<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmdEf_RoCO-1yM4AG-Pskp0bXfcEkNGNdmqSvyrHLAth8wBLERgT33yS4Hp3oGyelkaD9HfOqA2O-uGvVtwSCsJmvmfEdemWaRwYFHWIerHlcmexluEkD40hEa0XdSWOJ7ZLTkBQ/s1600/str.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 133px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmdEf_RoCO-1yM4AG-Pskp0bXfcEkNGNdmqSvyrHLAth8wBLERgT33yS4Hp3oGyelkaD9HfOqA2O-uGvVtwSCsJmvmfEdemWaRwYFHWIerHlcmexluEkD40hEa0XdSWOJ7ZLTkBQ/s200/str.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5705891491885259666" /></a>Страуструп читал длинный несколько затянутый доклад, где давал примеры плохого кода, показывал как его нужно исправить. Просил не использовать голые указатели, а использовать смарт поинтеры и объекты на стеке. Рассказывал про move semantics.<br /><br />Ханс Боэм рассказывал про потоки, довольно много было про race conditions, примеры кода где они есть, примеры кода где их таки нет...<br /><br />Лававей рассказывал про STL в С++11 на такой космической скорости, что мне было трудно следить за его мыслью. <br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvhwLspw97UeiXt-CyTQge2sdBIi110kWQHTa1Lvjh8xBiCqK_OfqfQiBZcscDOSlpJSLs0SobGX5mQ60Z42a8UEW9KM8z70e5EIMkNG6XYpjwv2em8aGNtQ4hY5-ExgutigKOpA/s1600/alex.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 133px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvhwLspw97UeiXt-CyTQge2sdBIi110kWQHTa1Lvjh8xBiCqK_OfqfQiBZcscDOSlpJSLs0SobGX5mQ60Z42a8UEW9KM8z70e5EIMkNG6XYpjwv2em8aGNtQ4hY5-ExgutigKOpA/s200/alex.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5705893276812128226" /></a>Дальше выступал Андрей Александреску. Андрей оказался очень юморным товарищем - поглумился над скоростным Лававеем, зацитировал чей-то твит, <br /><blockquote>Don't think I'll be able to stay up to see whatever Cthuloid-template-horror Andrei Alexandrescu has in store. #GoingNative</blockquote><br />после чего сказал "и я здесь не для того, чтобы вас разочаровать" и показал, что можно закрутить variadic templates по-разному. Что-либо оттуда на практике я не буду применять, думаю, никогда. На следующий день он рассказывал, что один из слушателей ему сказал: "Андрей, мне понравился твой доклад, но я ничего не понял". Очень правильная фраза.<br /><br />Следующий день начался с доклада Саттера. Прекрасный и полезный доклад, с примерами, разбором каких-то не очевидных вещей. Если у вас особенно нет времени, но вы хотите получить общее представление о С++11 можно послушать только один этот доклад. Он, кстати, привел даты выхода книг по С++11:<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhyphenhyphen0b5BqbLIenMT8SYWBZDb8c7WkG0Qvg2FpokWb2N6X0YjoOG8rAo4Qv3ct5fHSjQLRuodqVwv4bpWPEELHWjEeC1_gic1o3A_i_3S_yTz0M9-HH9yrST14YJTjEhNBSA43I_5Q/s1600/cpp11books.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhyphenhyphen0b5BqbLIenMT8SYWBZDb8c7WkG0Qvg2FpokWb2N6X0YjoOG8rAo4Qv3ct5fHSjQLRuodqVwv4bpWPEELHWjEeC1_gic1o3A_i_3S_yTz0M9-HH9yrST14YJTjEhNBSA43I_5Q/s400/cpp11books.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5705894612727278018" /></a><br /><br />Дальше Чандлер Карус рассказывал про Clang. Было бодро и весело, но я так и не поняла, чем все то, о чем он рассказывал, отличается от других статических анализаторов кода.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-g2anW4IlIXTp-aiGSpv_LWLQIrAWMtpWUrb4YjgRS0tCw8f1C4oA8pnCSlM1NMreW9uh81zxKGnVe5zReeu5ghK6GsMikJaUH9bO01KNlrjOjoyNp_iPXQ_bqfX6u0nHkIfuwQ/s1600/all.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-g2anW4IlIXTp-aiGSpv_LWLQIrAWMtpWUrb4YjgRS0tCw8f1C4oA8pnCSlM1NMreW9uh81zxKGnVe5zReeu5ghK6GsMikJaUH9bO01KNlrjOjoyNp_iPXQ_bqfX6u0nHkIfuwQ/s400/all.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5705894985366425394" /></a><br /><br />Неожиданным для меня оказался состав пришедших на конференцию. Индусов и китайцев было очень-очень мало. Больше половины пришедших составляли американцы. И где-то треть - русскоязычные. Если послушаете вопросы-ответы на конференции, то не раз услышите родной акцент. На обеде народ разговаривал на двух языках - русском и английском.<br /><br />Кстати про обед. Кормили шикарно, причем был не только обед, но и завтрак со свежими фруктами, и перерывы на чай с тортами и печеньками.<br /><br />Итого: Герб Саттер сказал нам, что C++11 feels like a new language, посмотрим как оно на самом деле.<br /><br />(Спасибо моему коллеге Артему за фотографии)Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com7tag:blogger.com,1999:blog-10303035.post-21255132579332488822012-01-09T07:24:00.011+04:002012-01-15T00:52:20.665+04:00Карта С++11<a href="http://fearlesscoder.blogspot.com/2012/01/c11-lands.html">English translation</a><br /><br />В последнее время на землях языка С++ <a href="http://alenacpp.blogspot.com/2011/10/iso-c11.html">происходили масштабные изменения</a>. И старая карта стала безнадежно устаревшей. Поэтому в новогодние праздники мы с <a href="http://jimblog.me/">Джимом</a> напряглись и изобразили их все на карте. Вернее, изображал все конечно он, умение рисовать не относится к числу моих талантов. Он не только добавил бои за новый стандарт, но и значительно улучшил старые территории.<br /><br />Так что встречайте новою версию! Осторожно, она здоровая - 13 мегов.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://softwaremaniacs.org/Images/alenacpp/cppmap-2012.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 279px;" src="http://softwaremaniacs.org/Images/alenacpp/cppmap-2012-small.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5695471602841395298" /></a><br /><br />Для тех, кто не осилил закачать 13 мегов (кто вы, люди?) - <a href="http://jimblog.me/wp-content/uploads/2012/01/c++map2.jpg">JPEG</a> на 4 мега<br /><br />Кроме банального "распечатать и повесить на стену" народ нашел старой карте множество применений. В одном немецком вузе ее используют для обучения студентов. Несколько раз она была использована во время выступления на конференциях. Магазин из какого-то российского города (забыла уже откуда именно), торгующий холодным оружием, зачем-то использовал элемнты карты в своей рекламе.<br />Мы не против того, чтобы вы делали с картой что угодно. Но помните, что часть картинок честно стырена из интернетов и копирайтов на них у нас нет.<br /><br />О найденных ошибках и опечатках сообщайте в редакцию, пожалуйста. <strong>Updated</strong>: опечатку с management поправили<br /><br />Исходники:<br /><a href="http://softwaremaniacs.org/Images/alenacpp/cppmap-2012.cdr">cppmap-2012.cdr</a> - собственно исходник<br /><a href="http://softwaremaniacs.org/Images/alenacpp/cppmap-2012.svg">cppmap-2012.svg</a> - он же, конвертнутый в более популярный формат<br /><a href="http://softwaremaniacs.org/Images/alenacpp/reikland_paper.jpg">reikland_paper.jpg</a> - текстура потертой бумаги<br /><br />Ссылки по теме:<br /><a href="http://alenacpp.blogspot.com/2009/06/c.html">Карта языка C++ (The C++ Lands)</a> - cтарая картаAlenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com35tag:blogger.com,1999:blog-10303035.post-31577110202622438112011-12-12T06:33:00.002+04:002011-12-12T06:36:54.379+04:00Пойду на конференцию GoingNative 2012В начале февраля тут у нас в Редмонде будет конференция <a href="http://channel9.msdn.com/Events/GoingNative/GoingNative-2012">GoingNative 2012</a>. Рассказывать будут о C++11. Обещают, что там будут Страуструп и Александреску. Схожу, посмотрю на них, потом вам расскажу.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com8tag:blogger.com,1999:blog-10303035.post-90335523208034017032011-11-23T09:00:00.008+04:002011-11-27T12:44:18.582+04:00Опубликованы исходники Doom 3Помните, Кармак обещал опубликовать исходники Doom 3 после выхода Rage? Он свое слово держит: <a href="https://github.com/TTimo/doom3.gpl">Doom 3 GPL source release</a><br /><br /><code>/*<br />===========================================================================<br /><br />Doom 3 GPL Source Code<br />Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. </code><br /><br />Это только исходники, без данных. Данные можно взять из самой игры.<br /><br />Из-за юридических проблем ему пришлось убрать оттуда кусок кода, известный как Carmack's Reverse.<br /><br />Должно компиляться под Win32, Linux и MacOS.<br /><br />Написано на С++, но это скорее похоже на С с классами - голые указатели, сишные массивы.<br /><br />Как это обычно бывает, не все доведено до идеального состояния.<br /><br /><code>qglDisableClientState( GL_NORMAL_ARRAY );<br />qglDisable( GL_FRAGMENT_PROGRAM_ARB );<br />qglDisable( GL_VERTEX_PROGRAM_ARB );<br />// <span style="font-weight:bold;">Fixme</span>: Hack to get around an apparent bug in ATI drivers. Should remove as soon as it gets fixed.<br />qglBindProgramARB( GL_VERTEX_PROGRAM_ARB, 0 );</code><br /><br />Как видно из кода, для отрисовки используется OpenGL. <strike>Почему-то в readme написано, что нужен DirectX. Непонятно.</strike> DirectX <a href="http://alenacpp.blogspot.com/2011/11/doom-3.html#comment-6702967456750174974">нужен для DirectInput</a>.<br /><br />Подменив данные и <span style="font-style:italic;">слегка</span> поменяв код можно написать 3D-шутер своей мечты :-).Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com7tag:blogger.com,1999:blog-10303035.post-14086577045687711582011-10-11T10:17:00.003+04:002011-10-11T10:28:15.418+04:00ISO C++11 опубликованМне уже много раз присылали письма с вопросами "новый стандарт С++ уже вышел, почему у тебя в блоге ничего про это нет???". Однако, <a href="http://www.iso.org/iso/pressrelease.htm?refid=Ref1472">официальный пресс-релиз</a> о выходе нового Стандарта появился только сегодня, 10.10.2011, и Твиттер начал радоваться именно сегодня. И да, у нас тут всё еще десятое, хотя у вас у многих уже 11.<br />Итак, можно открывать шампанское и праздновать, с обязательным зачитыванием вслух пресс-релиза. <br />Герб Саттер написал об этом радостном событии тут: <a href="http://herbsutter.com/2011/10/10/iso-c11-published/">ISO C++11 Published</a>. <br />ISO, как обычно, будет продавать финальный вариант Стандарта за деньги и, как обычно, последний черновик Стандарта, который мало чем отличается от финальной версии, можно взять <a href="http://www.open-std.org/jtc1/sc22/wg21/">тут</a>.<br />Ура.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com13tag:blogger.com,1999:blog-10303035.post-50630918331863608422011-09-23T08:34:00.003+04:002011-09-23T09:01:16.167+04:00Интервью со Страуструпом на bigthink.com<a href="http://bigthink.com/bjarnestroustrup">Интервью с Бьярном Страуструпом</a>. <br /><br /><object id="flashObj" width="480" height="270" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0"><param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&isUI=1" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="videoId=722717886001&playerID=651017566001&playerKey=AQ~~,AAAAGuNzXFE~,qu1BWJRU7c26MMkbB19ukwmFB5ysvYz5&domain=embed&dynamicStreaming=true" /><param name="base" value="http://admin.brightcove.com" /><param name="seamlesstabbing" value="false" /><param name="allowFullScreen" value="true" /><param name="swLiveConnect" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&isUI=1" bgcolor="#FFFFFF" flashVars="videoId=722717886001&playerID=651017566001&playerKey=AQ~~,AAAAGuNzXFE~,qu1BWJRU7c26MMkbB19ukwmFB5ysvYz5&domain=embed&dynamicStreaming=true" base="http://admin.brightcove.com" name="flashObj" width="480" height="270" seamlesstabbing="false" type="application/x-shockwave-flash" allowFullScreen="true" allowScriptAccess="always" swLiveConnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed></object><br /><br /><br />Рассказывает про то, как он создавал С++ и про то какой это хороший язык. :-)<br />Считает, что каждый программист должен знать 5 языков. Страуструп советует: С++ и набрать еще из Java, Python, Ruby, JavaScript, C, C#, какой-нибудь функциональный язык.<br /><br />Сказал, что использует ежедневно и Windows, и Linux.<br /><br />В конце дает совет С++ разработчикам: использовать все фичи С++, в том числе посмотреть новый стандарт. "Почитайте хорошую книгу и посмотрите не застряли ли вы в 80х или 90х".Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com26tag:blogger.com,1999:blog-10303035.post-71423039432239011132011-07-12T18:22:00.003+04:002011-07-13T10:23:45.970+04:00Порядок инициализации статических переменныхПорядок инициализации глобальных статических переменных из разных единиц трансляции не определен. По-английский это называется красивым термином <a href="http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14">static initialization order fiasco</a>. Это означает, что если у вас в разных файлах определены глобальные статические переменные x и y, то лучше, чтобы они не зависели одна от другой, а то тут могут быть неприятные сюрпризы.<br /><br />Это было скучная теория. А вот грустные примеры из практики. Пишем много-много кода с большим количеством нетривиальных глобальных статических переменных. Они как-то <span style="font-style:italic;">самопроизвольно</span> начинают друг от друга зависеть. До поры, до времени компиляция идет таким путем, что они нормально инициализируются. Но в один прекрасный день, после добавления какого-то куска кода, они вдруг начинают инициализироваться в <span style="font-style:italic;">немного</span> другом порядке. И это означает, что надо переосмыслить весь проект целиком. Прямо сейчас.<br /><br />Updated 12.07.2011:<br />В комментариях посоветовали два способа продлить агонию, т.е. заставить компилятор инициализировать глобальные переменные в определенном порядке.<br />Для GCC это <a href="http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html">init_priority</a><br />Для VC++ <a href="http://altdevblogaday.com/2011/07/07/writing-a-pre-main-function-forcing-global-initialization-order-within-vc/">#pragma init_seg</a><br /><br />P.S. Для примеров из жизни я обычно не указываю когда и кем были допущены какие-то ошибки. Это информация для того, чтобы научиться, а не для того, чтобы поглумиться. Мы все ошибаемся.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com22tag:blogger.com,1999:blog-10303035.post-72935712557802992112011-04-18T10:16:00.002+04:002011-04-18T10:21:36.482+04:00Inception in C<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfqqLko2z-mX3jpKqCF-aOJZAml1kfm8mbwdom1hyupXtTktuB2vK3_XYU4_WSN1TCUr2mNDoJNVxa6UzRyXFcDvoagz_OhaQZyo_OkAG_2iRlnxrt8ASPQjrFsbwWCKOwL9xUQQ/s1600/foo.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 241px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfqqLko2z-mX3jpKqCF-aOJZAml1kfm8mbwdom1hyupXtTktuB2vK3_XYU4_WSN1TCUr2mNDoJNVxa6UzRyXFcDvoagz_OhaQZyo_OkAG_2iRlnxrt8ASPQjrFsbwWCKOwL9xUQQ/s400/foo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5596804810602786866" /></a><br />via <a href="http://m0riarty.ya.ru/">Moriarty</a>Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com15tag:blogger.com,1999:blog-10303035.post-55242079443860916862011-02-25T23:43:00.002+03:002011-02-25T23:46:36.504+03:00Критика boost::serialize<a href="http://mdf-i.blogspot.com/2011/02/boostserialization-hell.html">boost::serialization hell</a> - эмоциональный пост про проблемы, возникающие при использовании boost::serialize.<br />Будет полезно тем, кому в проекте нужна сериализация и кто рассматривает boost::serialize как один из вариантов.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com13tag:blogger.com,1999:blog-10303035.post-52246147902040213312011-02-14T08:05:00.002+03:002011-02-14T08:07:23.993+03:00Статья с сравнением ++it и it++В статье <a href="http://habrahabr.ru/blogs/cpp/113661/">Есть ли практический смысл использовать для итераторов префиксный оператор инкремента ++it, вместо постфиксного it++</a> Андрей Карпов ставит эксперименты с префиксными и постфисными операторами.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com18tag:blogger.com,1999:blog-10303035.post-88217613172501530262011-01-16T07:00:00.003+03:002011-01-16T07:06:23.310+03:00Приняла участие в подкасте Радио ТНа подкасте <a href="http://radio-t.com/podcasts/radio-t-222/">Радио Т номер 222</a> поговорили о языках программирования вообще и о C++ в частности. <br />Размышления на тему судьбы языка С++ стали особенно актуальны после недели ненависти к С++ на Хабрахабре.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com66tag:blogger.com,1999:blog-10303035.post-31299316139753099712010-12-08T19:14:00.014+03:002010-12-22T19:20:46.704+03:00Выложили записи моих докладов с ADD-2010Организаторы потихоньку выкладывают <a href="http://addconf.ru/index.sdf">записи докладов с ADD-2010</a>, мои уже выложили.<br /><br />Первый доклад, <span style="font-weight:bold;">Искусственный интеллект в играх</span><br />Про нечестные приемы, про поиск пути и навигацию.<br /><br /><iframe src="http://player.vimeo.com/video/12955832" width="500" height="281" frameborder="0"></iframe><p><a href="http://vimeo.com/12955832">218-Games-AI-add-2010.avi</a> from <a href="http://vimeo.com/belonesox">Stas Fomin</a> on <a href="http://vimeo.com">Vimeo</a>.</p><br />Материалы, которые я использовала для подготовки к докладу:<br /><a href="http://www.reddit.com/r/gaming/comments/coqg7/its_not_fun_if_you_fake_it_rigged_gameplay/">It's not fun if you fake it. Rigged gameplay mechanics are starting to piss me off.</a><br /><a href="http://www.gamasutra.com/view/feature/3920/the_pure_advantage_advanced_.php">The Pure Advantage: Advanced Racing Game AI</a><br /><a href="http://aigamedev.com/open/articles/bugs-caught-on-tape/">18 Embarrassing Game AI Bugs Caught On Tape... and Fixed!</a><br /><a href="http://www.youtube.com/watch?v=fM5kY5t8Bz0">OpenSteerDemo</a><br /><a href="http://blogs.msdn.com/b/shawnhar/archive/2009/12/17/the-psychology-of-randomness.aspx">The psychology of randomness</a><br /><a href="http://cbloomrants.blogspot.com/2010/09/09-06-10-weighteddecayrand.html">WeightedDecayRand</a><br /><a href="http://www.gamespot.com/pc/strategy/civilizationv/video/6253529/gdc-2010-keynote-address-sid-meier">GDC 2010 Keynote Address: Sid Meier</a><br /><a href="http://aigamedev.com/open/tutorials/theta-star-any-angle-paths/">Theta*: Any-Angle Path Planning for Smoother Trajectories in Continuous Environments</a><br /><a href="http://aigamedev.com/open/reviews/near-optimal-hierarchical-pathfinding/">Near-Optimal Hierarchical Pathfinding (HPA*)</a><br /><a href="http://habrahabr.ru/blogs/games/100698/">Сравнение алгоритмов поиска маршрутов в StarCraft и StarCraft 2</a><br /><a href="http://aigamedev.com/open/articles/hole-navmesh-dear-zombie/">There's a Hole in Your NavMesh, Dear Zombie</a><br /><br />Второй доклад, <span style="font-weight:bold;">C++0x</span><br />Я не рассчитала время, доклад получился коротким. Первратим это в плюс. <br />Короткий, но насыщенный доклад про C++0x! Всего на 25 минут, а если вопросы не слушать, то и того меньше!<br /><iframe src="http://player.vimeo.com/video/14457262" width="500" height="281" frameborder="0"></iframe><p><a href="http://vimeo.com/14457262">225-C0xx-add-2010.avi</a> from <a href="http://vimeo.com/belonesox">Stas Fomin</a> on <a href="http://vimeo.com">Vimeo</a>.</p><br /><br /><span style="font-weight:bold;">Updated 09.12.2010:</span><br />Во время доклада был задан вопрос, почему для атрибутов нельзя использовать слово final вместо [[final]]. Там были высказаны предположения, но ответ так и не был дан.<br /> <a href="http://herbsutter.com/2010/12/08/trip-report-november-2010-c-standards-meeting">Отвечает Герб Саттер</a>.<br />Для это пришлось бы использовать контекстный парсинг, а делать это не хотелось, потому что нигде до этого в языке это не использовалось. Но все-таки они решили сделать именно так. И final будет просто final, без каких-либо скобочек.<br /><span style="font-weight:bold;">/Updated</span><br /><br />Материалы, которые я использовала для подготовки к докладу:<br /><a href="http://wiki.apache.org/stdcxx/C++0xCompilerSupport">C++0x features and their support in popular compilers</a><br /><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm">Initializer List proposed wording</a><br /><a href="http://stackoverflow.com/questions/3492742/compile-time-string-manipulation-with-variadic-templates">Compile-time 'String' Manipulation with Variadic Templates</a><br /><a href="http://www-sop.inria.fr/geometrica/events/WG21_meeting_june_2008/public_talks.html">C++0x: An overview, by Bjarne Stroustrup</a><br /><a href="http://www2.research.att.com/~bs/C++0xFAQ.html">C++0x FAQ</a><br /><a href="http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx">C++0x Core Language Features In VC10: The Table</a><br /><a href="http://www.aristeia.com/C++0x/C++0xFeatureAvailability.htm">Summary of C++0x Feature Availability in gcc and MSVC</a><br /><a href="http://habrahabr.ru/blogs/cpp/66021/">C++0x. Лямбда-выражения</a><br /><a href="http://www.rsdn.ru/forum/cpp/3778357.flat.aspx">C++0x lambda</a><br /><br />P.S. Лучше все это смотреть в HD и на полный экранAlenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com20tag:blogger.com,1999:blog-10303035.post-53591036097627783492010-10-22T18:36:00.000+04:002010-10-22T18:37:00.966+04:00Electronic Arts приоткрыла EASTL<a href="http://gpl.ea.com/">EA открыла немножечко исходников</a>, в том числе EASTL. Насколько я понимаю, далеко не весь. <br />Чтобы не мучаться и не искать EASTL в этих исходниках самим, можно его посмотреть вот здесь: <a href="http://github.com/paulhodge/EASTL">EASTL</a>.<br /><br />Там есть аппетитно выглядящие ссылки типа Sims 3, но исходников симов там нет, увы.<br /><br />В 2007 году у меня был <a href="http://alenacpp.blogspot.com/2007/06/eastl.html">пост про EASTL</a>, где я сказала следующее<br /><blockquote>Если будут какие-нибудь свободно доступные реализации EASTL, интересно было бы их опробовать.</blockquote><br />Прошло три года и счастье наступило. Хотя, когда именно произошло это событие, я не знаю. Никаких официальных пресс-релизов я не вижу. Судя по всему, EA сделала свою версию <a href="http://webkit.org/">WebKit</a>, который под LGPL, и ей пришлось выложить исходники, куда попала часть EASTL.<br /><br />Ссылки:<br /><a href="http://msinilo.pl/blog/?p=668">EA STL released, updated benchmarks</a> - здесь я узнала об этой новости. Как видно из заголовка, там в статье есть бенчмарки<br /><br />Есть чем заняться на выходных :-).Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com11tag:blogger.com,1999:blog-10303035.post-91536866443829761182010-07-26T22:59:00.004+04:002010-07-26T23:14:00.467+04:00Пост Will it optimize?<a href="http://ridiculousfish.com/blog/archives/2010/07/23/will-it-optimize/">Will it optimize?</a> - опросник, в котором вам предлагается угадать будет ли GCC проводить оптимизацию кода. Сложно и познавательно.<br /><br />Там очень здоровая шапка, чуть вниз отмотайте.<br /><br />Спасибо <a href="http://softwaremaniacs.org/blog/">Maniac</a>'у за ссылку.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com4tag:blogger.com,1999:blog-10303035.post-29134595486619663422010-06-10T16:26:00.002+04:002010-06-11T12:12:26.787+04:00Пост "Проблемы с delete[]"В посте <a href="http://easy-coding.blogspot.com/2010/06/delete.html">Проблемы с delete[]</a> Александр рассказывает про undefined behavior вот такого кода:<br /><pre><code>A* a = new B[T];<br />delete[] a;</code></pre><br />Рекомендую.<br /><br /><span style="font-weight:bold;">Updated 11.07.2010</span>: <a href="http://www.blogger.com/profile/07861391108370568285">Eugene K.</a> <a href="http://easy-coding.blogspot.com/2010/06/delete.html?showComment=1276182441327#c1419027836280113277">справедливо уточняет</a><br /><blockquote>Вообще-то для получения проблем необязательно удалять. Достаточно выполнить какой-нибудь доступ к элементу "массива" a с индексом больше нуля.<br /><br />A* a = new B[T];<br />a[1].p = 42; // запишет не туда<br /><br />То есть проблема собственно в строке выделения "A* a = new B[T];". Если над ней помедитировать, то можно догадаться, что она лишена смысла.</blockquote>Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com13tag:blogger.com,1999:blog-10303035.post-36147394158831842202010-05-28T15:45:00.006+04:002010-05-28T16:36:30.596+04:00Неинициализированный указатель и вызов функцииС неинициализированными указателями на экземпляр класса связан один неприятный момент. Допустим, у нас есть класс CBase, в котором есть функция, которая не обращается к переменным класса. То есть указатель this не использует.<pre><code>class CBase<br />{<br /> int i;<br />public:<br /> void f() { std::cout<<"CBase::f"<<std::endl;}<br />};</code></pre><br /><br />И если где-то дальше вы написали код вроде такого:<pre><code><br />CBase* p = NULL;<br />p->f();</code></pre><br /><br />То по стандарту это undefined behavior. Однако очень часто функция отрабатывает нормально. Visual Studio 2008, например, генерит вполне себе работающий код. А чего, вызов этой функции был разрешен на этапе компиляции, указатель this не нужен. И довольно долго может создаваться ощущение, что все нормально работает. Можно даже привести более страшно выглядящий пример<br /><pre><code>((CBase*)0)->f();</code></pre><br /><br />Но на самом деле далеко не все нормально. Как только появляется обращение к this, то программа начинает "падать". Примеры:<br /><pre><code>class CBase<br />{<br /> int i;<br />public:<br /> virtual void f() { std::cout<<"CBase::f"<<std::endl;}<br />};</code></pre><br /><pre><code>class CBase<br />{<br /> int i;<br />public:<br /> void f() { std::cout<<"CBase::f"<<std::endl; i=0;}<br />};</code></pre><br /><br />Все это приводит к очень интересным трудно отлавливаемым багам.<br /><br />Ссылка по теме:<br /><a href="http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/973d123899a47183/28dc98028831e914">comp.lang.c++.moderated - Functions that don't use this, called with uninitialized pointers</a>Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com30tag:blogger.com,1999:blog-10303035.post-51109425620951628412010-03-17T15:18:00.004+03:002010-03-17T15:33:41.788+03:00Lock-free контейнеры<a href="http://users.livejournal.com/_foreseer/47590.html">Пост Андрея Гулина(Яндекс, Поиск) с реализацией TLockFreeQueue</a> и <a href="http://rsdn.ru/forum/cpp/3730905.all.aspx">обсуждение на rsdn</a>. По ссылкам - много полезной информации по <a href="http://en.wikipedia.org/wiki/Lock-free_and_wait-free_algorithms">lock-free</a> контейнерам и готовый код.<br /><br />Спасибо <a href="http://orvind.livejournal.com/">orvind</a>'у за ссылку.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com2tag:blogger.com,1999:blog-10303035.post-35581450541628520212010-02-26T16:31:00.001+03:002010-02-26T16:35:33.467+03:00C++0x: Делегирующие конструкторы (Delegating Constructors)Еще одна приятная фича C++0x, которой лично мне очень не хватало - делегирующие конструкторы. Дальше я кратко изложу вот этот документ: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986">Delegating Constructors (revision 3)[pdf]</a>.<br /><br />Бывает так, что классу нужно несколько конструкторов, и тогда бывает удобно из одного конструктора вызвать другой. А сделать этого нельзя. Сейчас это решается функциями инициализации. Это несколько неинтуитивный способ и у него есть недостатки.<br />Пример кода с функцией инициализации.<br /><pre><code>class X {<br /> void CommonInit();<br /> Y y_;<br /> Z z_;<br />public:<br /> X();<br /> X( int );<br /> X( W );<br />};<br /><br />X::X() : y_(42), z_(3.14) { CommonInit(); }<br />X::X( int i ) : y_(i), z_(3.14) { CommonInit(); }<br />X::X( W e ) : y_(53), z_( e ) { CommonInit(); }</code></pre><br /><br />Недостатки этого метода:<br />1. Несмотря на то, что тела у этих конструкторов совпадают, слить их в один не получится. <br />2. Невозможно делегировать инициализацию переменных.<br /><br />Начинающие программисты часто не знают, что вызвать один конструтор из другого нельзя и пишут что-то вроде такого:<br /><pre><code>class X {<br /> int i_;<br />public:<br /> X();<br /> X( int );<br />};<br />X::X() { DoSomethingObservableToThisObject(); }<br />X::X( int i ) : i_(i) { X(); } </code></pre><br /><br />Этот код компилируется, но делает совсем не то, что хотел программист.<br /><br />Чего будет в С++0x: один конструктор, он называется "делегирующий конструктор", сможет вызывать другой, "целевой конструктор".<br /><br />Пример кода:<br /><pre><code>class X {<br /> int i_;<br />public:<br /> X( int i ) : i_(i) { }<br /> X() : X(42) { } // i_ == 42<br />};</code></pre><br /><br />Сильно лучше, чем было, но я нашла один существенный минус. Если делегирующие конструкторы образуют цикл, то результатом будет undefined behavior. Диагностику новый Стандарт не требует. <br /><br />Также см. Стандарт C++0x, 12.6.2.Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com9tag:blogger.com,1999:blog-10303035.post-14102410380804894872010-02-08T12:35:00.002+03:002010-02-08T12:40:52.178+03:00Heap corruption и работа с дебажной кучейНемного расскажу про дебажную кучу, речь пойдет о Visual Studio 2008. В остальных версиях дебажная куча выглядит примерно так же. Про другие компиляторы не знаю.<br /><br />Основная мысль - дебажная куча отличается от релизной, чтобы облегчить отладку. И, если в дебаге произойдет порча памяти, то ее можно отловить. Visual Studio выдает в таком случае окно с сообщением и пишет в Output что-то вроде<pre><code><br />Heap corruption at address.<br />HEAP[MyProg.exe]: Heap block at 0AC6A400 modified at 0AC6A6EC <br />past requested size of 2e4</code></pre><br />Итак, в чем состоят отличия и каким образом отлавливаются ошибки. Давайте я пример приведу, с примером удобнее.<br /><pre><code>class CBase <br />{<br />public: <br /> int BaseI;<br /> int BaseJ;<br />};<br /><br />class CDerived : public CBase<br />{<br />public:<br /> int DerivedI;<br />};<br /><br />int main()<br />{<br /> CBase *pBase = new CBase;//(1)<br /> <br /> pBase->BaseI = 3;<br /> pBase->BaseJ = 4;//(2) <br /><br /> delete pBase;//(3) <br /><br /> return 0;<br />}</code></pre><br /><br />Как будет выглядеть память в точке (1). (Чтобы вывести окно с памятью, выберите Debug->Windows->Memory->Memory1).<br /><br /><pre><code>0x00984ED8 cd cd cd cd cd cd cd cd fd fd fd fd 00 00 00 00</code></pre> <br /><br />У меня экземпляр класса CBase расположился по адресу 0x00984ED8. Оба int'а, а это восемь байт, заполнены значением 0xCD, Clean Memory. Это значение по умолчанию.<br />Дальше четыре байта 0XFD, Fence Memory, она же "no mans land". Это такой заборчик, которым обрамляется свежевыделенная память. Перед адресом 0x00984ED8 стоят точно такие же четыре байта.<br /><br />Точка (2).<br /><pre><code>0x00984ED8 03 00 00 00 04 00 00 00 fd fd fd fd 00 00 00 00</code></pre><br /><br />Мы записали значения 3 и 4 и они идут одно за другим. Младший байт идет первым, потому что я работают с <a href="http://en.wikipedia.org/wiki/Endianness#Little-endian">little endian</a> платформой.<br /><br />Точка (3)<br /><pre><code>0x00984ED8 dd dd dd dd dd dd dd dd dd dd dd dd 00 00 00 00</code></pre><br />Память после удаления заполняется значениями 0xDD, Dead Memory. После вызова функции HeapFree() будет заполнена значениями 0xFEEEFEEE.<br /><br /><br />Давайте теперь сымитируем багу и посмотрим как Visual Studio ее поймает. Это реальная бага, я ее упростила до синтетического примера. На самом деле кода было больше и он был размазан по нескольким функциям.<br /><br /><pre><code><br /> CBase *pBase = new CBase;//(1)<br /> <br /> pBase->BaseI = 3;<br /> pBase->BaseJ = 4;//(2) <br /><br /> CDerived* pDerived = static_cast<CDerived*>(pBase);<br /><br /> pDerived->DerivedI = 7;//(3)<br /> delete pBase;<br /></code></pre><br /><br />Итак, мы стали приводить по иерархии с помощью static_cast'а, вместо dynamic_cast'а. Что в итоге получили. В точках (1) и (2) программа выглядит все также. В точке (3) мы полезли в чужую память и затерли забор.<br /><pre><code>03 00 00 00 04 00 00 00 07 00 00 00 00 00 00 00</code></pre><br /><br />После попытки вызвать delete pBase мы получим сообщение об ошибке, потому что забора нет, а это означает, что мы лазили в чужую память.<br /><br /><pre><code>HEAP CORRUPTION DETECTED: after Normal block (#68) at 0x008D4ED8.<br />CRT detected that the application wrote to memory after end of heap buffer.</code></pre><br /><br />Еще различия между дебажной и релизной кучами приводят к тому, что программа начинает себя вести по-разному в дебаге и в релизе. Простой пример - дебажная "падает", релизная нет. Очень может быть, что "падение" - это не падение вовсе, а как раз сообщение о порче памяти. Почитайте повнимательнее, что там в окне написано.<br />Также народ жалуется, что дебажная версия работает сильно меденнее релизной. Причиной этого в том числе может быть дебажная куча. В интернетах пишут, что можно ее в дебаге отключить то ли с помощью переменной окружения _NO_DEBUG_HEAP, то ли NO_DEBUG_HEAP, в единицу ее надо выставить. Я пробовала ее отключить, куча осталась дебажной.<br /><br />Ссылки по теме:<br /><a href="http://www.nobugs.org/developer/win32/debug_crt_heap.html">Win32 Debug CRT Heap Internals</a><br /><a href="http://www.codeguru.com/cpp/w-p/win32/tutorials/article.php/c9535/">Inside CRT: Debug Heap Management</a><br /><a href="http://msdn.microsoft.com/en-us/library/aa270812(VS.60).aspx">Memory Management and the Debug Heap (MSDN)</a><br /><a href="http://alenacpp.blogspot.com/2005/08/c.html">Приведение типов в C++</a>Alenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.com15