<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Личный опыт разработки ПО</title>
	
	<link>http://www.devexp.ru</link>
	<description>Сборник рецептов</description>
	<lastBuildDate>Wed, 31 Mar 2010 19:02:57 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/devexp" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="devexp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">devexp</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Use of undefined type</title>
		<link>http://www.devexp.ru/2010/03/use-of-undefined-type/</link>
		<comments>http://www.devexp.ru/2010/03/use-of-undefined-type/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 18:47:25 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/03/use-of-undefined-type/</guid>
		<description><![CDATA[Давайте поговорим о неприятных граблях связанных с удалением неполного типа, что может привести к крайне неприятным последствиям, например милому сердцу Segmentation fault. Связано это с двумя вещами:

Полномочиями данными компилятору автоматически генерировать деструктор, если он не определен в классе 
Возможностью вызвать оператор delete для объекта тип которого в точке удаления еще не известен 

Рассмотрим простой код [...]]]></description>
			<content:encoded><![CDATA[<p>Давайте поговорим о неприятных граблях связанных с удалением неполного типа, что может привести к крайне неприятным последствиям, например милому сердцу <strong>Segmentation fault</strong>. Связано это с двумя вещами:</p>
<ol>
<li>Полномочиями данными компилятору автоматически генерировать деструктор, если он не определен в классе </li>
<li>Возможностью вызвать оператор delete для объекта тип которого в точке удаления еще не известен </li>
</ol>
<p>Рассмотрим простой код и посмотрим, что делает компилятор:</p>
<p><strong>test.h</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#ifndef TEST_H</span>
<span style="color: #339900;">#define TEST_H</span>
&nbsp;
<span style="color: #0000ff;">class</span> Test
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	~Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #339900;">#endif//TEST_H</span></pre></div></div>

<p><strong>test.cpp</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #339900;">#include &quot;test.h&quot;</span>
&nbsp;
Test<span style="color: #008080;">::</span><span style="color: #007788;">Test</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Test&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
Test<span style="color: #008080;">::</span>~Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;~Test&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><strong>trouble.h</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#ifndef TROUBLE_H</span>
<span style="color: #339900;">#define TROUBLE_H</span>
&nbsp;
<span style="color: #339900;">#include &lt;memory&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Test<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Trouble
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Trouble<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
	std<span style="color: #008080;">::</span><span style="color: #007788;">auto_ptr</span><span style="color: #000080;">&lt;</span>Test<span style="color: #000080;">&gt;</span> Test_<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #339900;">#endif//TROUBLE_H</span></pre></div></div>

<p><strong>trouble.cpp</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;test.h&quot;</span>
&nbsp;
<span style="color: #339900;">#include &quot;trouble.h&quot;</span>
&nbsp;
Trouble<span style="color: #008080;">::</span><span style="color: #007788;">Trouble</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008080;">:</span> Test_<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">new</span> Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><strong>main.cpp</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;trouble.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> 
<span style="color: #008000;">&#123;</span>
	Trouble trouble<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Итак, имеется два класса: Test и Trouble, причем в целях ускорения компиляции разработчик решил сделать предварительное объявление класса Test в trouble.h, но не написал деструктор для класса Trouble, а значит компилятор заботливо создаст деструктор сам. Когда он это сделает? Вообще компилятор не мечется по коду, а последовательно его анализирует. </p>
<p>Начнет он с функции main в main.cpp, определит, что создается объект trouble типа Trouble из trouble.h, обнаружит конструктор. </p>
<p>Далее он сделает вывод, что по выходу из main объект trouble должен быть удален, попытается найти деструктор, не найдет его и создаст его сам. </p>
<p>Что будет в этом деструкторе? Естественно удаление членов класса, то есть в данном случае std::auto_ptr&lt;Test&gt;, в деструкторе которого будет соответственно вызван оператор delete для указателя на Test. </p>
<p>Внимательно следим за руками! В данном месте компилятор еще ничего не знает о типе Test, поскольку еще не дошел до test.h и поэтому оператор delete будет применен к неполному типу, что вызовет неопределенное поведение. </p>
<p>Откомпилировав приведенный код и выполнив программу вы скорее всего на выводе получите только сообщение из конструктора, деструктор для Test вызван не будет!</p>
<p>Далее подробности и методы борьбы с данным явлением.</p>
<p><p style="text-align: right"><a href="http://www.devexp.ru/2010/03/use-of-undefined-type/">Читать дальше...</a></p><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/03/use-of-undefined-type/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/03/use-of-undefined-type/#comments">3 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/03/use-of-undefined-type/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>О копировании объектов в C++</title>
		<link>http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/</link>
		<comments>http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 21:18:36 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/</guid>
		<description><![CDATA[Я регулярно сталкиваюсь с ошибками связанными с невнимательностью или незнанием механизма копирования объектов в C++. Поэтому первое правило:
Не копируйте!
Задайте себе вопрос, действительно ли класс должен поддерживать копирование? Скорее всего это не нужно как по соображениям эффективности (передавать объект по ссылке или указателю менее накладно, чем создавать его копию при передаче по значению), так и просто [...]]]></description>
			<content:encoded><![CDATA[<p>Я регулярно сталкиваюсь с ошибками связанными с невнимательностью или незнанием механизма копирования объектов в C++. Поэтому первое правило:</p>
<h2>Не копируйте!</h2>
<p>Задайте себе вопрос, действительно ли класс должен поддерживать копирование? Скорее всего это не нужно как по соображениям эффективности (передавать объект по ссылке или указателю менее накладно, чем создавать его копию при передаче по значению), так и просто исходя из здравого смысла – зачем две копии объекта, представляющего к примеру базу данных с пользователями или порт? Поэтому сделайте класс некопируемым. Для этого надо перенести объявления копирующего конструктора и оператора присваивания в защищенную секцию (определять их необязательно):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Port
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Port<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">virtual</span> ~Port<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
	Port<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> Port<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	Port<span style="color: #000040;">&amp;</span> operator<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> Port<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div>

<p>В этом случае при попытке скопировать объект возникнет ошибка компиляции из-за недоступности либо конструктора копирования, либо оператора присваивания.</p>
<p>Но чтобы каждый раз не писать данный код и дать людям ясно понять чего вы хотите, унаследуйте класс от boost::noncopyable:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;boost/noncopyable.hpp&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Port
	<span style="color: #008080;">:</span> <span style="color: #0000ff;">private</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">noncopyable</span>
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Port<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">virtual</span> ~Port<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div>

<p>На этом можно остановиться, но если же вы решили, что класс должен поддерживать копирование, то читайте дальше.</p>
<p><p style="text-align: right"><a href="http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/">Читать дальше...</a></p><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/#comments">2 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Архивирование с библиотеками zlib и bzip2/libbzip2 используя Boost Iostreams</title>
		<link>http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/</link>
		<comments>http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 19:59:18 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Boost]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/</guid>
		<description><![CDATA[Недавно у меня возникла задача добавить сжатие данных в программу. Сразу нашлось две свободных библиотеки – zlib и libbzip2 написанные на C. Изучив вопрос глубже, оказалось что писать удобные обертки над функциями на C не нужно, так как в Boost IOStreams все уже написано.
О том как добавить данный функционал и правильно собрать проект я расскажу [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно у меня возникла задача добавить сжатие данных в программу. Сразу нашлось две свободных библиотеки – <a href="http://zlib.net/" target="_blank">zlib</a> и <a href="http://www.bzip.org/" target="_blank">libbzip2</a> написанные на C. Изучив вопрос глубже, оказалось что писать удобные обертки над функциями на C не нужно, так как в <a href="http://www.boost.org/doc/libs/1_42_0/libs/iostreams/doc/index.html" target="_blank">Boost IOStreams</a> все уже написано.</p>
<p>О том как добавить данный функционал и правильно собрать проект я расскажу в данной заметке. Также будет приведен пример кода для сжатия и распаковки файлов и сравнение zlib (алгоритм <strong>DEFLATE</strong>, методы <strong>gzip</strong> и <strong>zlib</strong>) и libbzip2 (алгоритм <strong>bzip2</strong>) по скорости работы и уровню сжатия тестовых, бинарных и исполняемых файлов.</p>
<p> <p style="text-align: right"><a href="http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/">Читать дальше...</a></p><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/#comments">Нет комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>,  <a href="http://www.devexp.ru/category/razrabotka/" title="Просмотреть все записи в Разработка" rel="category tag">Разработка</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Полезные переменные CMake</title>
		<link>http://www.devexp.ru/2010/03/poleznye-peremennye-cmake/</link>
		<comments>http://www.devexp.ru/2010/03/poleznye-peremennye-cmake/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 20:14:35 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Сборка]]></category>
		<category><![CDATA[CMake]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/03/poleznye-peremennye-cmake/</guid>
		<description><![CDATA[Крайне полезная информация по переменным CMake находится по адресу http://www.cmake.org/Wiki/CMake_Useful_Variables. После прочтения сами собой отпадают многие вопросы.
Ну и напомню, что содержимое переменной XXX можно посмотреть:

message (${XXX})

И изменить:

set (XXX ${XXX} значение)

А также проверить присутствует ли в переменной определенная подстрока:

if (XXX MATCHES &#34;подстрока&#34;)
	...
endif ()

Если нужно изменить часть содержимого переменной (например флаг компилятора), то на помощь придут регулярные [...]]]></description>
			<content:encoded><![CDATA[<p>Крайне полезная информация по переменным CMake находится по адресу <a href="http://www.cmake.org/Wiki/CMake_Useful_Variables" target="_blank">http://www.cmake.org/Wiki/CMake_Useful_Variables</a>. После прочтения сами собой отпадают многие вопросы.</p>
<p>Ну и напомню, что содержимое переменной XXX можно посмотреть:</p>

<div class="wp_syntax"><div class="code"><pre class="cmake" style="font-family:monospace;"><span style="color: #1f3f81; font-style: bold;">message</span> <span style="color: #197d8b;">(</span><span style="color: #b08000;">${XXX}</span><span style="color: #197d8b;">)</span></pre></div></div>

<p>И изменить:</p>

<div class="wp_syntax"><div class="code"><pre class="cmake" style="font-family:monospace;"><span style="color: #1f3f81; font-style: bold;">set</span> <span style="color: #197d8b;">(</span>XXX <span style="color: #b08000;">${XXX}</span> значение<span style="color: #197d8b;">)</span></pre></div></div>

<p>А также проверить присутствует ли в переменной определенная подстрока:</p>

<div class="wp_syntax"><div class="code"><pre class="cmake" style="font-family:monospace;"><span style="color: #1f3f81; font-style: bold;">if</span> <span style="color: #197d8b;">(</span>XXX <span style="color: #077807; font-sytle: italic;">MATCHES</span> <span style="color: #912f11;">&quot;подстрока&quot;</span><span style="color: #197d8b;">)</span>
	...
<span style="color: #1f3f81; font-style: bold;">endif</span> <span style="color: #197d8b;">()</span></pre></div></div>

<p>Если нужно изменить часть содержимого переменной (например флаг компилятора), то на помощь придут регулярные выражения:</p>

<div class="wp_syntax"><div class="code"><pre class="cmake" style="font-family:monospace;"><span style="color: #1f3f81; font-style: bold;">string</span> <span style="color: #197d8b;">(</span><span style="color: #077807; font-sytle: italic;">REGEX</span> <span style="color: #077807; font-sytle: italic;">REPLACE</span> /W[0-4] /W4 CMAKE_CXX_FLAGS <span style="color: #b08000;">${CMAKE_CXX_FLAGS}</span><span style="color: #197d8b;">)</span></pre></div></div>

<p>В данном случае будет установлен максимальный уровень предупреждений <strong>/W4</strong> для компилятора от Microsoft.</p>
<img src="http://www.devexp.ru/?ak_action=api_record_view&id=69&type=feed" alt="" /><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/03/poleznye-peremennye-cmake/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/03/poleznye-peremennye-cmake/#comments">9 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/razrabotka/" title="Просмотреть все записи в Разработка" rel="category tag">Разработка</a>,  <a href="http://www.devexp.ru/category/razrabotka/sborka/" title="Просмотреть все записи в Сборка" rel="category tag">Сборка</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/03/poleznye-peremennye-cmake/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Чтение настроек приложения</title>
		<link>http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/</link>
		<comments>http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 14:23:07 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Конфигурирование]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Boost]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/</guid>
		<description><![CDATA[Мне часто приходится писать гибко конфигурируемые программы. Конфигурационные файлы часто получаются довольно сложными, с развитой иерархией. Для хранения настроек я использовал XML файлы, а разбор конфигурации делал вручную.
Недавно (с версии 1.41.0) в Boost появилась библиотека Property Tree, предназначенная для решения данной задачи. Помимо поддержки XML, также поддерживаются форматы INI, JSON и свой формат INFO. 
В [...]]]></description>
			<content:encoded><![CDATA[<p>Мне часто приходится писать гибко конфигурируемые программы. Конфигурационные файлы часто получаются довольно сложными, с развитой иерархией. Для хранения настроек я использовал <strong>XML</strong> файлы, а разбор конфигурации делал вручную.</p>
<p>Недавно (с версии 1.41.0) в <strong>Boost</strong> появилась библиотека <a href="http://www.boost.org/doc/libs/1_42_0/libs/property_tree/index.html" target="_blank">Property Tree</a>, предназначенная для решения данной задачи. Помимо поддержки <strong>XML</strong>, также поддерживаются форматы <strong>INI</strong>, <strong>JSON</strong> и свой формат <strong>INFO</strong>. </p>
<p>В данной заметке я рассмотрю указанные форматы и приведу код для разбора файла.</p>
<p> <p style="text-align: right"><a href="http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/">Читать дальше...</a></p><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/#comments">4 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>,  <a href="http://www.devexp.ru/category/razrabotka/configuration/" title="Просмотреть все записи в Конфигурирование" rel="category tag">Конфигурирование</a>,  <a href="http://www.devexp.ru/category/razrabotka/" title="Просмотреть все записи в Разработка" rel="category tag">Разработка</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Boost Optional</title>
		<link>http://www.devexp.ru/2010/02/boost-optional/</link>
		<comments>http://www.devexp.ru/2010/02/boost-optional/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 19:45:07 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Boost]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/02/boost-optional/</guid>
		<description><![CDATA[В C# при объявлении переменной можно приставить знак вопроса, после чего в дальнейшем проверять была ли переменная инициализирована или нет:

int? a;
...
if &#40;a.HasValue&#41;
&#123;
	...
&#125;

Иногда это бывает очень полезно, например при работе с базами данных.
В C++ к сожалению такого удобства нет, но как известно – программисты C++ отличаются верностью и если язык не предоставляет какую либо возможность, они [...]]]></description>
			<content:encoded><![CDATA[<p>В C# при объявлении переменной можно приставить знак вопроса, после чего в дальнейшем проверять была ли переменная инициализирована или нет:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">int</span><span style="color: #008000;">?</span> a<span style="color: #008000;">;</span>
...
<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>a.<span style="color: #0000FF;">HasValue</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	...
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Иногда это бывает очень полезно, например при работе с базами данных.</p>
<p>В C++ к сожалению такого удобства нет, но как известно – программисты C++ отличаются верностью и если язык не предоставляет какую либо возможность, они ее добавляют сами. Например в <strong>Boost</strong> данный функционал присутствует:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;boost/optional.hpp&gt;</span>
...
<span style="color: #007788;">boost</span><span style="color: #008080;">::</span><span style="color: #007788;">optional</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> a<span style="color: #008080;">;</span>
std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>a.<span style="color: #007788;">is_initialized</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;Есть значение&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;Нет значения&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
boost<span style="color: #008080;">::</span><span style="color: #007788;">optional</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> b<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>b <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;Есть значение&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;Нет значения&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
a <span style="color: #000080;">=</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>a <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;Есть значение&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;Нет значения&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> result <span style="color: #000080;">=</span> a.<span style="color: #007788;">get</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> b.<span style="color: #007788;">get</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> result <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
b.<span style="color: #007788;">reset</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>b <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;Есть значение&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;Нет значения&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span></pre></div></div>

<p>Вывод:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Нет значения
Есть значение
Есть значение
<span style="color: #000000;">8</span>
Нет значения</pre></div></div>

<img src="http://www.devexp.ru/?ak_action=api_record_view&id=66&type=feed" alt="" /><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/02/boost-optional/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/02/boost-optional/#comments">Нет комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/02/boost-optional/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Использование Doxygen для документирования кода</title>
		<link>http://www.devexp.ru/2010/02/ispolzovanie-doxygen-dlya-dokumentirovaniya-koda/</link>
		<comments>http://www.devexp.ru/2010/02/ispolzovanie-doxygen-dlya-dokumentirovaniya-koda/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 20:00:51 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[Документирование]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Doxygen]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/02/ispolzovanie-doxygen-dlya-dokumentirovaniya-koda/</guid>
		<description><![CDATA[
Написание документации к коду задача не самая простая и уж точно не самая приятная, но к счастью существуют инструменты которые могут существенно упростить эту процедуру. Для этих целей я использую инструмент Doxygen и именно о нем пойдет речь.
Что такое Doxygen?
Doxygen – это кроссплатформенная система документирования кода с поддержкой языков C++, C, Java, Objective-C, PHP, C# [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.doxygen.org/" target="_blank"><img src="http://www.devexp.ru/wp-content/uploads/2010/02/doxygen.png" /></a>
<p>Написание документации к коду задача не самая простая и уж точно не самая приятная, но к счастью существуют инструменты которые могут существенно упростить эту процедуру. Для этих целей я использую инструмент <strong>Doxygen</strong> и именно о нем пойдет речь.</p>
<h2>Что такое Doxygen?</h2>
<p>Doxygen – это кроссплатформенная система документирования кода с поддержкой языков C++, C, Java, Objective-C, PHP, C# (список можно уточнить на <a href="http://www.doxygen.org/" target="_blank">сайте проекта</a>).</p>
<p>Для создания документации достаточно просто писать комментарии в коде, придерживаясь нескольких простых правил. </p>
<p>Doxygen умеет анализировать исходный код проекта и создавать удобную документацию в формате HTML, Latex, RTF, XML, man, CHM.</p>
<h2>Общие соображения</h2>
<ol>
<li>Написание документации должно быть максимально простым, чтобы разработчики не &quot;забывали&quot; это делать. Отсюда вывод, что сложность форматирования комментариев должна быть минимальной.
<p>Хорошо:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">namespace</span> A
<span style="color: #008000;">&#123;</span>
<span style="color: #ff0000; font-style: italic;">/**
Имя класса
&nbsp;
Описание класса
*/</span>
	<span style="color: #0000ff;">class</span> B
	<span style="color: #008000;">&#123;</span>
	<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Плохо:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">namespace</span> A
<span style="color: #008000;">&#123;</span>
	<span style="color: #ff0000; font-style: italic;">/**
	 * Имя класса
	 * 
	 * Описание класса
	 */</span>
	<span style="color: #0000ff;">class</span> B
	<span style="color: #008000;">&#123;</span>
	<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Почему второй вариант хуже? Очевидно, из-за необходимости выравнивать комментарии на одном уровне с комментируемой сущностью, а также из-за избыточных символов <strong>*</strong>. Это может показаться надуманным, но при написании комментариев из нескольких строк проблема проявляется, а при поддержке кода и вовсе становится кошмаром. Вы можете возразить, что подобный стиль делает код &quot;рваным&quot;, но в любом случае комментирование интерфейсов делает код менее читаемым. К счастью все современные редакторы кода позволяют легко свернуть блоки с комментариями, что позволит взглянуть на код без помех.</p>
</li>
<li>Много документации – плохо, так как мало кто будет читать длинные мануалы. Из этого следует, что документированы должны быть только открытые (public) и защищенные (protected) интерфейсы. Закрытые (private) интерфейсы – часть внутренней реализации и не должны быть в руководстве. </li>
</ol>
<p><p style="text-align: right"><a href="http://www.devexp.ru/2010/02/ispolzovanie-doxygen-dlya-dokumentirovaniya-koda/">Читать дальше...</a></p><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/02/ispolzovanie-doxygen-dlya-dokumentirovaniya-koda/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/02/ispolzovanie-doxygen-dlya-dokumentirovaniya-koda/#comments">7 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/razrabotka/documentation/" title="Просмотреть все записи в Документирование" rel="category tag">Документирование</a>,  <a href="http://www.devexp.ru/category/razrabotka/" title="Просмотреть все записи в Разработка" rel="category tag">Разработка</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/02/ispolzovanie-doxygen-dlya-dokumentirovaniya-koda/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Скорость CMake</title>
		<link>http://www.devexp.ru/2010/02/skorost-cmake/</link>
		<comments>http://www.devexp.ru/2010/02/skorost-cmake/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 17:33:25 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Сборка]]></category>
		<category><![CDATA[CMake]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/02/skorost-cmake/</guid>
		<description><![CDATA[Некоторые интересуются, а как же у CMake со скоростью? Субъективно все достаточно быстро, если же говорить о цифрах, то один из разработчиков Quantum GIS приводит в своем блоге сравнение скорости сборки их проекта с CMake и с Autotools. Цифры конечно впечатляют – так хорошо, что даже странно. Смотрите сами:
http://blog.qgis.org/?q=node/16


Copyright &#169; 2010, Личный опыт разработки ПО. [...]]]></description>
			<content:encoded><![CDATA[<p>Некоторые интересуются, а как же у CMake со скоростью? Субъективно все достаточно быстро, если же говорить о цифрах, то один из разработчиков Quantum GIS приводит в своем блоге сравнение скорости сборки их проекта с <strong>CMake</strong> и с <strong>Autotools</strong>. Цифры конечно впечатляют – так хорошо, что даже странно. Смотрите сами:</p>
<p><a title="http://blog.qgis.org/?q=node/16" href="http://blog.qgis.org/?q=node/16">http://blog.qgis.org/?q=node/16</a></p>
<img src="http://www.devexp.ru/?ak_action=api_record_view&id=60&type=feed" alt="" /><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/02/skorost-cmake/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/02/skorost-cmake/#comments">Нет комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/razrabotka/" title="Просмотреть все записи в Разработка" rel="category tag">Разработка</a>,  <a href="http://www.devexp.ru/category/razrabotka/sborka/" title="Просмотреть все записи в Сборка" rel="category tag">Сборка</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/02/skorost-cmake/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Определение операционной системы с CMake</title>
		<link>http://www.devexp.ru/2010/02/opredelenie-versii-sistemy-s-cmake/</link>
		<comments>http://www.devexp.ru/2010/02/opredelenie-versii-sistemy-s-cmake/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 18:29:53 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Сборка]]></category>
		<category><![CDATA[CMake]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/02/opredelenie-versii-sistemy-s-cmake/</guid>
		<description><![CDATA[Часто при сборке кроссплатформенного приложения необходимо знать на какой платформе выполняется сборка. Это нужно для включения определенных файлов специфичных для конкретной платформы, например средства межпроцессного взаимодействия для Linux или для Windows.
Для определения типа платформы существует несколько переменных:

UNIX – системы соответствующие стандарту POSIX (например Linux, FreeBSD или MAC OS X), включает CygWin 
WIN32 – понятно без [...]]]></description>
			<content:encoded><![CDATA[<p>Часто при сборке кроссплатформенного приложения необходимо знать на какой платформе выполняется сборка. Это нужно для включения определенных файлов специфичных для конкретной платформы, например средства межпроцессного взаимодействия для Linux или для Windows.</p>
<p>Для определения типа платформы существует несколько переменных:</p>
<ul>
<li>UNIX – системы соответствующие стандарту POSIX (например Linux, FreeBSD или MAC OS X), включает CygWin </li>
<li>WIN32 – понятно без комментариев </li>
</ul>
<p>Зная это легко проделать нужные действия:</p>

<div class="wp_syntax"><div class="code"><pre class="cmake" style="font-family:monospace;"><span style="color: #1f3f81; font-style: bold;">if</span> <span style="color: #197d8b;">(</span>WIN32<span style="color: #197d8b;">)</span>
	<span style="color: #1f3f81; font-style: bold;">set</span> <span style="color: #197d8b;">(</span>SOURCES <span style="color: #b08000;">${SOURCES}</span> win_pipe.cpp<span style="color: #197d8b;">)</span>
<span style="color: #1f3f81; font-style: bold;">elseif</span> <span style="color: #197d8b;">(</span>UNIX<span style="color: #197d8b;">)</span>
	<span style="color: #1f3f81; font-style: bold;">set</span> <span style="color: #197d8b;">(</span>SOURCES <span style="color: #b08000;">${SOURCES}</span> posix_pipe.cpp<span style="color: #197d8b;">)</span>
<span style="color: #1f3f81; font-style: bold;">else</span> <span style="color: #197d8b;">()</span>
	<span style="color: #1f3f81; font-style: bold;">message</span> <span style="color: #197d8b;">(</span><span style="color: #077807; font-sytle: italic;">FATAL_ERROR</span> <span style="color: #912f11;">&quot;Неизвестная система&quot;</span><span style="color: #197d8b;">)</span>
<span style="color: #1f3f81; font-style: bold;">endif</span> <span style="color: #197d8b;">()</span></pre></div></div>

<p>Обратите внимание, что команда <strong>message </strong>с ключом <strong>FATAL_ERROR</strong> выводит сообщение и прекращает выполнение работы.</p>
<p>Иногда этого бывает мало и необходимо точно определить тип системы или даже дистрибутив и его версию. Для этих целей можно использовать переменную <strong>CMAKE_SYSTEM</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="cmake" style="font-family:monospace;"><span style="color: #1f3f81; font-style: bold;">if</span> <span style="color: #197d8b;">(</span><span style="color: #b08000;">${CMAKE_SYSTEM}</span> <span style="color: #077807; font-sytle: italic;">MATCHES</span> <span style="color: #912f11;">&quot;Linux&quot;</span><span style="color: #197d8b;">)</span>
	<span style="color: #1f3f81; font-style: bold;">message</span> <span style="color: #197d8b;">(</span><span style="color: #912f11;">&quot;Linux&quot;</span><span style="color: #197d8b;">)</span>
	<span style="color: #1f3f81; font-style: bold;">if</span> <span style="color: #197d8b;">(</span><span style="color: #b08000;">${CMAKE_SYSTEM}</span> <span style="color: #077807; font-sytle: italic;">MATCHES</span> <span style="color: #912f11;">&quot;fc8&quot;</span><span style="color: #197d8b;">)</span>
		<span style="color: #1f3f81; font-style: bold;">message</span> <span style="color: #197d8b;">(</span><span style="color: #912f11;">&quot;Fedora 8&quot;</span><span style="color: #197d8b;">)</span>
	<span style="color: #1f3f81; font-style: bold;">endif</span> <span style="color: #197d8b;">()</span>
<span style="color: #1f3f81; font-style: bold;">elseif</span> <span style="color: #197d8b;">(</span><span style="color: #b08000;">${CMAKE_SYSTEM}</span> <span style="color: #077807; font-sytle: italic;">MATCHES</span> <span style="color: #912f11;">&quot;FreeBSD&quot;</span><span style="color: #197d8b;">)</span>
	<span style="color: #1f3f81; font-style: bold;">message</span> <span style="color: #197d8b;">(</span><span style="color: #912f11;">&quot;FreeBSD&quot;</span><span style="color: #197d8b;">)</span>
<span style="color: #1f3f81; font-style: bold;">elseif</span> <span style="color: #197d8b;">(</span><span style="color: #b08000;">${CMAKE_SYSTEM}</span> <span style="color: #077807; font-sytle: italic;">MATCHES</span> <span style="color: #912f11;">&quot;Darwin&quot;</span><span style="color: #197d8b;">)</span>
	<span style="color: #1f3f81; font-style: bold;">message</span> <span style="color: #197d8b;">(</span><span style="color: #912f11;">&quot;Mac OS X&quot;</span><span style="color: #197d8b;">)</span>
<span style="color: #1f3f81; font-style: bold;">endif</span> <span style="color: #197d8b;">()</span></pre></div></div>

<p>Полный список полезных переменных можно посмотреть в <a href="http://www.cmake.org/Wiki/CMake_Useful_Variables#System_.26_Compiler_Information" target="_blank">Kitware Public Wiki</a>.</p>
<img src="http://www.devexp.ru/?ak_action=api_record_view&id=59&type=feed" alt="" /><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/02/opredelenie-versii-sistemy-s-cmake/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/02/opredelenie-versii-sistemy-s-cmake/#comments">Нет комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/razrabotka/" title="Просмотреть все записи в Разработка" rel="category tag">Разработка</a>,  <a href="http://www.devexp.ru/category/razrabotka/sborka/" title="Просмотреть все записи в Сборка" rel="category tag">Сборка</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/02/opredelenie-versii-sistemy-s-cmake/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Освобождение памяти занятой контейнером</title>
		<link>http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/</link>
		<comments>http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 18:55:30 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/</guid>
		<description><![CDATA[На днях объяснял товарищу, что у некоторых контейнеров (например std::vector, std::deque, std::string) метод clear(), хоть и удаляет свое содержимое, но вот выделенную память не возвращает. Точнее может вернуть, а может и нет (GCC 4.2.4 и MS VS 2005 не возвращают). Например, после запуска следующей программы:

#include &#60;iostream&#62;
#include &#60;vector&#62;
&#160;
int main&#40;int argc, char* argv&#91;&#93;&#41;
&#123;
	std::vector&#60;int&#62; data;
	data.resize&#40;200000&#41;;
	std::cout &#60;&#60; data.capacity&#40;&#41; &#60;&#60; [...]]]></description>
			<content:encoded><![CDATA[<p>На днях объяснял товарищу, что у некоторых контейнеров (например std::vector, std::deque, std::string) метод clear(), хоть и удаляет свое содержимое, но вот выделенную память не возвращает. Точнее может вернуть, а может и нет (GCC 4.2.4 и MS VS 2005 не возвращают). Например, после запуска следующей программы:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> data<span style="color: #008080;">;</span>
	data.<span style="color: #007788;">resize</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">200000</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> data.<span style="color: #007788;">capacity</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
	data.<span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> data.<span style="color: #007788;">capacity</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Будет выведено:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000dd;">200000</span>
<span style="color: #0000dd;">200000</span></pre></div></div>

<p>Что же делать? Не паниковать, а после удаления содержимого использовать следующую идиому:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>.<span style="color: #007788;">swap</span><span style="color: #008000;">&#40;</span>data<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Также может быть полезным освободить незанятую память, например после удаления доброй половины большого контейнера:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>data<span style="color: #008000;">&#41;</span>.<span style="color: #007788;">swap</span><span style="color: #008000;">&#40;</span>data<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>На мой взгляд поведение крайне не интуитивное, я например в свое время об этом узнал из книги Герба Саттера и Андрея Александреску &quot;Стандарты программирования на C++&quot;.</p>
<img src="http://www.devexp.ru/?ak_action=api_record_view&id=58&type=feed" alt="" /><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/#comments">Нет комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 2.235 seconds --><!-- Cached page generated by WP-Super-Cache on 2010-08-28 17:56:37 -->
