<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>0xc0de</title>
	<atom:link href="http://0xc0de.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://0xc0de.wordpress.com</link>
	<description>Computadores, Programação e TI. Divagações...</description>
	<lastBuildDate>Tue, 29 Nov 2011 20:31:41 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='0xc0de.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>0xc0de</title>
		<link>http://0xc0de.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://0xc0de.wordpress.com/osd.xml" title="0xc0de" />
	<atom:link rel='hub' href='http://0xc0de.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Inteiros de precisão arbitrária em C++</title>
		<link>http://0xc0de.wordpress.com/2011/10/15/inteiros-de-precisao-arbitraria-em-c/</link>
		<comments>http://0xc0de.wordpress.com/2011/10/15/inteiros-de-precisao-arbitraria-em-c/#comments</comments>
		<pubDate>Sat, 15 Oct 2011 22:35:34 +0000</pubDate>
		<dc:creator>0xc0de</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://0xc0de.wordpress.com/?p=423</guid>
		<description><![CDATA[English version Alguns meses atrás resolvi implementar as operações aritméticas fundamentais para inteiros de precisão arbitrária. O principal motivo era mais curiosidade do que necessidade, já que existem várias boas bibliotecas por aí com esse foco. Ainda assim, achei que valeria à pena o exercício e diversão. Originalmente estava atrás de algo bem simplista, mas [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=423&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="right"><a href="http://0xc0de.wordpress.com/2011/10/15/arbitrary-precision-integers-in-c/">English version</a></p>
<p>Alguns meses atrás resolvi implementar as operações aritméticas fundamentais para <a href="http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic">inteiros de precisão arbitrária</a>. O principal motivo era mais curiosidade do que necessidade, já que existem várias boas bibliotecas por aí com esse foco. Ainda assim, achei que valeria à pena o exercício e diversão.</p>
<p>Originalmente estava atrás de algo bem simplista, mas ao longo do percurso o código acabou tomando mais forma e eventualmente se transformou em uma classe C++ de API bem definida. Basicamente, foram aparecendo as conexões lógicas, uma coisa foi levando a outra, e no final das contas acabei implementando mais do que planejado.</p>
<p>A referência que utilizei foi o volume de Seminumerical Algorithms do livro do <a href="http://www-cs-faculty.stanford.edu/~uno/">Knuth</a>, <a href="http://www-cs-faculty.stanford.edu/~uno/taocp.html">The Art of Computer Programming</a>. Naturalmente, o legal é que mesmo o livro se preocupando em mencionar dicas de implementação, ainda há espaço para muitas questões no processo de conversão da descrição algorítmica para a o código final em C++.</p>
<p>Pontos interessantes que observei…</p>
<ul>
<li>Antes que qualquer coisa, o primeiro passo foi pensar em qual o modelo de representação a ser usado. Bom, no mundo binário a opção mais comum é o <a href="http://pt.wikipedia.org/wiki/Complemento_de_dois">complemento de dois</a>. No entanto, no caso de precisão arbitrária em um nível mais alto a base numérica é tipicamente um inteiro grande, logo uma abordagem de <a href="http://pt.wikipedia.org/wiki/Representa%C3%A7%C3%A3o_de_n%C3%BAmeros_com_sinal">magnitude e sinal</a> passa a ser uma boa opção.</li>
<li>Considerando magnitude e sinal, há ainda um aspecto flexível que é justamente a questão do zero. Qualificá-lo explicitamente ou utilizar apenas dois sinais e inferi-lo a partir dos valores? Achei mais simples e consistente ter um atributo que indica se o número é positivo, negativo ou zero.</li>
<li>Qual estrutura de dados e onde colocar os dígitos mais significativos? Normalmente um vetor é uma boa opção. Fornece acesso aleatório, você pode controlar a alocação com certa previsibilidade, não há overhead de espaço, a memória é contínua e há um mapeamento &#8220;natural&#8221; das operações. Com relação a posição dos dígitos mais significativos, colocá-los no final do vetor é o convencional, já que permite o crescimento/decrescimento do inteiro de forma eficiente.</li>
<li>Continuando o parágrafo acima, existe a necessidade de eliminar zeros iniciais que podem resultar de algumas operações. Isso facilita a implementação em geral. Além disso, como o zero não é representado apenas pela magnitude também precisei adicionar verificações um pouco &#8220;artificiais&#8221; após alguns cálculos.</li>
<li>As operações de adição, subtração e multiplicação são bem intuitivas. Nada muito elaborado, o único cuidado é com o tratamento do carry. Já a divisão com resto, essa é outra história. Obviamente, você pode seguir um algoritmo simples de subtrações consecutivas, mas eu queria algo mais bacana. O algoritmo apresentado no livro do Knuth é baseado na normalização do divisor e dividendo e de se estimar um valor para o quociente. Alguns detalhes são não-triviais e eu diria que há um certo potencial para erros na implementação. ;-) <em>Nota</em>: Há duas correções deste algoritmo na errata do livro.</li>
<li>Saindo do planejado… Acaba que para a divisão acima tive que implementar também as operações de shift esquerda/direita. Elas são recomendadas para a etapa de normalização. As outras operações que são uma evolução natural de usabilidade são as de conversão entre a base da representação e a base decimal. Isso permite a construção e impressão fáceis dos números a partir de uma string.</li>
<li>Testes, é claro. Afinal de contas, você precisa verificar de alguma forma se as coisas estão funcionando. Como neste caso estamos lidando com números de precisão arbitrária você precisa de uma ferramenta auxiliar. Por exemplo, uma calculadora poderosa ou uma outra biblioteca de inteiros grandes.</li>
</ul>
<p>Bom, eu já tinha disponibilidade o código há um tempinho, mas só agora resolvi escrever o blog. Ah, dê uma olhada nas notas antes…</p>
<p>O código está aqui: <a href="https://sites.google.com/site/ltcmelo/vlint">vlint (Very Long Integer)</a></p>
<p>Tchau!</p>
<p align="right">Leandro Melo</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/0xc0de.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/0xc0de.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/0xc0de.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/0xc0de.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/423/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=423&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://0xc0de.wordpress.com/2011/10/15/inteiros-de-precisao-arbitraria-em-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/965e41270dfe683efccaf4c4c26e6a14?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">0xc0de</media:title>
		</media:content>
	</item>
		<item>
		<title>Arbitrary precision integers in C++</title>
		<link>http://0xc0de.wordpress.com/2011/10/15/arbitrary-precision-integers-in-c/</link>
		<comments>http://0xc0de.wordpress.com/2011/10/15/arbitrary-precision-integers-in-c/#comments</comments>
		<pubDate>Sat, 15 Oct 2011 22:35:02 +0000</pubDate>
		<dc:creator>0xc0de</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://0xc0de.wordpress.com/?p=429</guid>
		<description><![CDATA[Versão em Português A couple months ago I decided to implement the fundamental arithmetic operations for integers with arbitrary precision. The main reason was mostly curiosity than need, since there are plenty of good libraries focused on this. Still, I thought it would be worth the exercise and the fun. Originally I was after something [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=429&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="right"><a href="http://0xc0de.wordpress.com/2011/10/15/inteiros-de-precisao-arbitraria-em-c/">Versão em Português</a></p>
<p>A couple months ago I decided to implement the fundamental arithmetic operations for <a href="http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic">integers with arbitrary precision</a>. The main reason was mostly curiosity than need, since there are plenty of good libraries focused on this. Still, I thought it would be worth the exercise and the fun.</p>
<p>Originally I was after something quite simplistic, but along the way the code started gaining more form and it eventually became a C++ class with well defined API. Basically, the logical connections were prompting, one thing led to another, and in the end I implemented more than I actually planned.</p>
<p>The reference I used was the volume for Seminumerical Algorithms from <a href="http://www-cs-faculty.stanford.edu/~uno/">Knuth</a>&#8216;s book <a href="http://www-cs-faculty.stanford.edu/~uno/taocp.html">The Art of Computer Programming</a>. It&#8217;s cool that although the book does worry about giving implementation tips, there still room for many questions that appear in the process of converting the algorithmic descriptions into the final C++ code.</p>
<p>Interesting things I observed&#8230;</p>
<ul>
<li>Prior to anything else, the first step was to think about which model should the representation rely on. Well, in the binary world the common option is <a href="http://en.wikipedia.org/wiki/Two's_complement">two&#8217;s complement</a>. However, in an arbitrary precision case from a higher level the numeric base is typically a big integer, so the <a href="http://en.wikipedia.org/wiki/Signed_number_representations">sign and magnitude</a> approach seems to be a good fit.</li>
<li>Considering sign and magnitude, there&#8217;s still a flexible aspect which is how exactly to handle the zero. Explicitly qualify it or use only the two signs and infer it from the values? I found it simpler and more consistent to have an extra attribute which tells whether the number is positive, negative, or the zero.</li>
<li>Which data-structure and where to place the most significant digits? Normally a vector is a good option. It provides random access, it&#8217;s possible to control allocation with certain predictability, no space overhead, memory is contiguous and there&#8217;s a &#8220;natural&#8221; mapping on how we do operations. Regarding the position of the digits, placing the most significant ones at the end of the vector is the conventional way, since it allows the integer to increase/decrease in an efficient manner.</li>
<li>Following on the paragraph above, there&#8217;s the need to eliminate leading zeros which might result from some operations. This easies  the implementation in general. Besides that, because the zero is not represented only through the magnitude I had to add a few &#8220;artificial&#8221; verifications after some calculations.</li>
<li>Addition, subtraction, and multiplication are quite intuitive. Nothing really elaborate, the only care needed is when manipulating the carry. On the other hand, the division with remainder is a different story. Obviously you can go for an algorithm of consecutive subtractions, but I wanted something a bit fancier. The algorithm presented on Knuth&#8217;s book is based on normalizing the divisor and dividend and on the estimation of a value for the quotient. Some details are non-trivial and I would say there&#8217;s a potential for errors in the implementation. ;-) <em>Note</em>: There are two corrections from the algorithm available in the errata.</li>
<li>Going out of the plan&#8230; It turns out that for the division with remainder I had to implement the shift left/right operations. They are recommended for the normalization phase. The other operations which are a natural evolution for the sake of usability are the conversions between the base representation and the decimal base. This is in order to make construction and printing of the integers easy through a string.</li>
<li>Testing, of course. After all you need to make sure somehow that things are working as expected. Since in this case we are dealing with arbitrary precision you need an auxiliary tool. For instance a powerful calculator or maybe another big integer library.</li>
</ul>
<p>Well, I had already published the code a while ago, but only now I decided to blog about it. Oh, and take a look at the notes&#8230;</p>
<p>You can find it here: <a href="https://sites.google.com/site/ltcmelo/vlint">vlint (Very Long Integer)</a></p>
<p>Tchau!</p>
<p align="right">Leandro Melo</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/0xc0de.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/0xc0de.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/0xc0de.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/0xc0de.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/429/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/429/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/429/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=429&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://0xc0de.wordpress.com/2011/10/15/arbitrary-precision-integers-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/965e41270dfe683efccaf4c4c26e6a14?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">0xc0de</media:title>
		</media:content>
	</item>
		<item>
		<title>Qualidade de código</title>
		<link>http://0xc0de.wordpress.com/2010/06/19/qualidade-de-codigo/</link>
		<comments>http://0xc0de.wordpress.com/2010/06/19/qualidade-de-codigo/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 21:59:09 +0000</pubDate>
		<dc:creator>0xc0de</dc:creator>
				<category><![CDATA[Divagações]]></category>
		<category><![CDATA[código-fonte]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[qualidade]]></category>

		<guid isPermaLink="false">http://0xc0de.wordpress.com/?p=380</guid>
		<description><![CDATA[Go to english version Recentemente tive a oportunidade de assitir uma palestra do Mark Shuttleworth na Linux Tag 2010. Naturalmente, foram abordados os assuntos de open-source de uma forma mais abrangente e do próprio Ubuntu. Não consegui acompanhar todos os detalhes pois não sou tão envolvido assim com Linux. Mas achei bem interessante quando ele [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=380&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="right"><a href="http://wp.me/piSt7-6q">Go to english version</a></p>
<p>Recentemente tive a oportunidade de assitir uma palestra do <a href="http://en.wikipedia.org/wiki/Mark_Shuttleworth">Mark Shuttleworth</a> na <a href="http://www.linuxtag.org/2010/">Linux Tag 2010</a>. Naturalmente, foram abordados os assuntos de <a href="http://en.wikipedia.org/wiki/Open-source_software">open-source</a> de uma forma mais abrangente e do próprio <a href="http://www.ubuntu.com/">Ubuntu</a>. Não consegui acompanhar todos os detalhes pois não sou tão envolvido assim com Linux. Mas achei bem interessante quando ele abordou a questão de qualidade de código.</p>
<p>Em particular, gostei bastante do que foi dito com relação à revisão de código. É relativamente comum quando programadores externos a um projeto ou simplesmente menos experientes têm seus códigos revisados por alguém do núcleo principal. O que pode não ser tão perceptível imediatamente é que essa prática também é extremamente útil no sentido inverso. Dessa forma, o aprendizado se torna bem mais motivante já que o novo programador é diretamente exposto ao que é considerado um modelo de código de boa qualidade dentro de determinado contexto. </p>
<p>Com certeza essa é uma prática já utilizada em vários projetos e empresas. Mas talvez não tanto quanto poderia ser. Portanto, se sua equipe ainda não a utiliza vale à pena considerar esse item para as próximas discussões sobre melhorias no processo de desenvolvimento.</p>
<p>Continuando o assunto, também comecei a refletir sobre a existência de uma definição amplamente aceita e, principalmente, adotada na prática do que é um código de boa qualidade. Creio que na grande maioria dos ambientes profissionais esse ponto é teoricamente tido como importante. Mas será que na prática é assim mesmo? Além disso, será que a meritocracia empregada no dia-a-dia dos envolvidos considera de forma justa esse fator?</p>
<p>Arriscaria dizer que boa parte dos engenheiros de software já passaram por uma situação na qual foram cobrados por terem atrasado no desenvolvimento de determinado software. Realmente estimativas não são fáceis de serem feitas. E uma das razões que podem deixá-las falhas é quando são baseadas em uma visão simplista e puramente comparativa com base em algum componente ou biblioteca escrita por determinado programador dentro de um determinado tempo. Sendo que em certos casos esse tal programador acaba sendo considerado como um exemplo pois executa suas tarefas com rapidez e &#8220;eficiência&#8221;.</p>
<p>O problem nesse tipo de situação é que o simples fato de que alguém conseguiu escrever determinado software em determinado tempo significa algo próximo de nada se pontos relacionados à qualidade do código não forem avaliados. Além dos fatores óbvios que são o software atender aos requisitos desejados e conter poucos (quem sabe zero) bugs, a lista abaixo resume minhas principais expectativas com relação a um bom código-fonte.</p>
<ul>
<li>Em primeiro lugar, o código deve ser altamente inteligível e limpo. Entender um programa é fácil para qualquer computador, mas nem sempre para um ser humano.</li>
<li>Deve haver boa reutilização de código. Trechos relativamente parecidos, funções compridas, abusos de herança, classes sobrecarregadas, entre outros, não são bons indicadores.</li>
<li>Mudanças de comportamento não muito complexas mas também não triviais devem ser suportadas por uma base flexível.</li>
<li>Pontos de extensão devem ser fornecidos. Idealmente da forma mais genérica possível.</li>
<li>Os recursos da linguagem de programação em questão devem ser usados da forma apropriada. Tanto o conhecimento da definição e estrutura da linguagem, assim como da API, devem ser visíveis.</li>
<li>Teste de unidade para os principais componentes. Dependendo do caso testes mais abrangentes também.</li>
<li>O código deve possuir uma única &#8220;cara&#8221;, desde técnicas/estilos de códificação até padrões arquiteturais. Isso promove a integridade conceitual do código.</li>
</ul>
<p>Pode ser que os itens acima não sejam novidade para ninguém. No entanto, chutaria dizer que na maioria dos projetos eles não são levados em consideração de forma profunda. Isso devido à falta de visão (da importância do assunto) ou até mesmo devido à falta de competência e conhecimento técnico para realizar uma avaliação detalhista e precisa.</p>
<p>Além disso, há ainda um fator complicador: o tempo. Nem sempre é possível chegar a uma conclusão definitiva com relação à qualidade de um código se não houver momentos em que seja necessário lidar diretamente com extensões ou qualquer tipo de manutenção sobre ele (incluindo, naturalmente, correção de bugs). Nesses casos as facilidades ou dificuldades encontradas durante tarefas reais podem contribuir significativamente para um veredito final. E para que isso aconteça é necessário que o software tenha passado por etapas relevantes de seu ciclo de vida. Não há substituto para o tempo.</p>
<p>Já vi muitas iniciativas com intuito de melhorar a qualidade de um produto tendo foco em gestão ou modelos processuais. Apesar de ajudarem (se muito ou pouco, depende do caso eu acho), elas nem sempre atuam diretamente na essência do problema (na verdade, da solução) que é a qualidade do código. Para investir em qualidade de produto é obrigatório investir, entre outras coisas, na qualidade do código-fonte. Portanto, tenha revisores de código que realmente entendam bem de fundamentos da computação (como algoritmos e estruturas de dados), que conheçam bem as linguagens de programação, as tecnologias envolvidas, boas práticas de programação e arquitetura, e que gostem de estudar.</p>
<p align="right">Leandro Melo</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/0xc0de.wordpress.com/380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/0xc0de.wordpress.com/380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/0xc0de.wordpress.com/380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/0xc0de.wordpress.com/380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/380/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=380&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://0xc0de.wordpress.com/2010/06/19/qualidade-de-codigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/965e41270dfe683efccaf4c4c26e6a14?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">0xc0de</media:title>
		</media:content>
	</item>
		<item>
		<title>Source-code quality</title>
		<link>http://0xc0de.wordpress.com/2010/06/19/source-code-quality/</link>
		<comments>http://0xc0de.wordpress.com/2010/06/19/source-code-quality/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 21:58:35 +0000</pubDate>
		<dc:creator>0xc0de</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[source-code]]></category>

		<guid isPermaLink="false">http://0xc0de.wordpress.com/?p=398</guid>
		<description><![CDATA[Ir para versão em português Recently I had an opportunity to watch a talk from Mark Shuttleworth at Linux Tag 2010. The subject of open-source was naturally approached together with discussions about Ubuntu. Since I am not that involved with Linux I could not follow all the details. Anyway, I thought it was particularly interesting [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=398&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="right"><a href="http://wp.me/piSt7-68">Ir para versão em português</a></p>
<p>Recently I had an opportunity to watch a talk from <a href="http://en.wikipedia.org/wiki/Mark_Shuttleworth">Mark Shuttleworth</a> at <a href="http://www.linuxtag.org/2010/">Linux Tag 2010</a>. The subject of <a href="http://en.wikipedia.org/wiki/Open-source_software">open-source</a> was naturally approached together with discussions about <a href="http://www.ubuntu.com/">Ubuntu</a>. Since I am not that involved with Linux I could not follow all the details. Anyway, I thought it was particularly interesting when the topic of source-code quality was touched.</p>
<p>I really liked what was said with regards to code review. It is relatively common when programmers outside to the project or simply less experienced have their code reviewed by the core people. What could not be perceptive at the first sight is that this practice can also be extremely useful in the reverse way. Thus, learning becomes much more motivating since the new programmer is directly exposed to what is considered a model of good code quality within a given context.</p>
<p>Surely this is a practice already used in several teams in many projects. But maybe not as much as it could be. So if your team have not used it yet it might be worth to consider this item for the forthcoming discussion on improvements in the development process.</p>
<p>Continuing on the subject, I also began to reflect whether there is any widely accepted definition and especially adopted in practice of what is source-code of good quality. I think that in most professional environments that point is considered important at least in theory. But how does that reflect in practice? Also, does the meritocratic system applied (intentionally or not) on the involved engineers consider this factor in a fair manner?</p>
<p>I venture to say that a lot of software engineers have gone through a situation in which they were blamed for having delayed the development of certain software. Yes, estimates are not easy to make. Still, one of the reasons that may cause them to fail is when they are based on a simplistic and purely comparative basis of a component or library written by a particular programmer within a particular time frame. Eventually such programmer might even end up being taken as an example because she performs her tasks quickly and &#8220;efficiently.&#8221;</p>
<p>The problem in this kind of situation is that the mere fact that someone managed to write some code in some time means next to nothing if issues related to the quality of the code are not evaluated. Besides the obvious factors which are that the software meets the desired requirements and contain few (perhaps zero) bugs, the list below summarizes my main expectations of a good code.</p>
<ul>
<li>First, the code should be highly intelligible and clean. Understanding a program is easy for any computer, but not always for a human being.</li>
<li>There should be good code reuse. Snippets which are very similar, long functions, abuses of inheritance, overloaded classes, among others, are not good indicators.</li>
<li>Not too complex changes which are not trivial either should be easily supported by a flexible basis.</li>
<li>Extension points should be provided. Ideally as generically as possible.</li>
<li>The features of the programming language in question must be properly used. Both the knowledge of the definition and structure of the language, as well as the API, should be visible.</li>
<li>Unit tests for the main components. Depending on the case even broader tests.</li>
<li>The code should have a single &#8216;face&#8217;, since programming techniques/coding style to architectural patterns. This promotes the conceptual integrity of the code.</li>
</ul>
<p>It may be that the above are not news to anyone. However, one could take a wild guess saying that in most projects they are not taken into account from a deep perspective. This may be due to a lack of vision (of the importance of the issue) or even due to the lack of expertise and technical knowledge to conduct a detailed and precise analysis.</p>
<p>Moreover, there is a complicating factor: time. Not always you can reach a definitive conclusion regarding the quality of a code if you do not go through moments when it is necessary to deal with extensions or any kind of maintenance (including, of course, bug fixes). In such cases the ease or difficulties encountered in real tasks can contribute significantly to a final verdict. And for that to happen the software needs to have gone through relevant stages of its life cycle. There is no substitute for time.</p>
<p>I have seen many initiatives aiming to improve quality of a product with focus on management or procedural models. Although they do help (how much depends on the case I guess), they do not always act directly on the essence of the problem (actually, the solution) which is the quality of the source-code. To invest in the quality of a product it is fundamental to invest, among other things, in the quality of the code. Therefore, have good code reviewers who really understands programming principles (such as algorithms and data structures), who are very familiar with the programming languages and technologies involved, which are aware of well known design and architectural practices, and who like to study.</p>
<p align="right">Leandro Melo</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/0xc0de.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/0xc0de.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/0xc0de.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/0xc0de.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/398/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=398&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://0xc0de.wordpress.com/2010/06/19/source-code-quality/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/965e41270dfe683efccaf4c4c26e6a14?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">0xc0de</media:title>
		</media:content>
	</item>
		<item>
		<title>C++: zero-initialization, default-initialization e value-initialization</title>
		<link>http://0xc0de.wordpress.com/2010/04/05/zero-default-value_initialization/</link>
		<comments>http://0xc0de.wordpress.com/2010/04/05/zero-default-value_initialization/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 18:54:24 +0000</pubDate>
		<dc:creator>0xc0de</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[compiladores]]></category>

		<guid isPermaLink="false">http://0xc0de.wordpress.com/?p=337</guid>
		<description><![CDATA[Recentemente resolvi fazer alguns testes relacionados a inicialização de objetos em C++ em diferentes ambientes. Tive algumas surpresas&#8230; O padrão C++ define três tipos de inicialização: zero-initialization &#8211; Neste texto traduzido como inicialização por zeros. default-initialization &#8211; Traduzido como inicialização padrão. value-initialization &#8211; Traduzido como inicialização por valor O significado de cada um é explicado [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=337&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recentemente resolvi fazer alguns testes relacionados a inicialização de objetos em C++ em diferentes ambientes. Tive algumas surpresas&#8230;</p>
<p>O padrão C++ define três tipos de inicialização:</p>
<ul>
<li><strong>zero-initialization</strong> &#8211; Neste texto traduzido como <em>inicialização por zeros</em>.</li>
<li><strong>default-initialization</strong> &#8211; Traduzido como <em>inicialização padrão</em>.</li>
<li><strong>value-initialization</strong> &#8211; Traduzido como <em>inicialização por valor</em></li>
</ul>
<p>O significado de cada um é explicado detalhadamente [§8.5.5]. Mas a linguagem e formalismo utilizados em documentos técnicos normalmente não são os mais triviais possíveis. Portanto, não é raro aparecerem algumas dúvidas.</p>
<p>O caso em que estava interessado é relativamente simples e abrange apenas um sub-conjunto das regras de inicialização. Colocando em termos práticos, queria analisar qual seria o valor de um membro inteiro de um <code>struct</code> em situações distintas.</p>
<p>Além de coisas mais simples e conhecidas como chamadas convencionais a construtores, as informações do padrão que considerei pertinentes para o seguinte trecho de código são as seguintes:</p>
<ul>
<li>Um objeto construído através de um par vazio de parêntesis deve passar por uma inicialização por valor [§ 8.5.7]. Note que isso se aplica a uma inicialização do tipo <code>T * t = new T();</code> [§ 5.3.4] ou até mesmo do tipo <code>T();</code>[§ 5.2.3].</li>
<li>Quando um objeto de tipo não-POD (Plain Old Data) não tem nenhum inicializador ele deve passar por uma inicialização padrão. Esse é o caso, por exemplo, de uma expressão como <code>T * t = new T;</code> ou <code>T t;</code>. No entanto, se o objeto for de tipo POD ele e seus sub-objetos não passam por inicialização alguma e, consequentemente, têm valor indeterminado [§ 8.5.9].</li>
<li>Uma inicialização padrão de um objeto tipo POD como <code>int</code> (não para arrays) resulta em uma inicialização por zeros [§ 8.5.5].</li>
<li>Uma inicialização por valor de um objeto de um tipo classe (excluindo <code>union</code>) promove uma inicialização por valor de seus membros não-estáticos e classes bases.</li>
</ul>
<p><pre class="brush: cpp;">
struct PlainOldData //POD
{
  int id_;
};

struct NonPOD_CompilerCtor
{
  int id() const { return id_; }

private:
  int id_;
};

struct NonPOD_UserCtor
{
  NonPOD_UserCtor() : id_() {}
  int id() const { return id_; }

private:
  int id_;
};
</pre></p>
<p>O programinha que escrevi apenas cria objetos dos tipos definidos acima com duas sintaxes diferentes. Em seguinda, inspeciono os valores do membro <code>id_</code>.</p>
<p><pre class="brush: cpp;">
int main()
{
  PlainOldData * a = new PlainOldData;
  NonPOD_CompilerCtor * b = new NonPOD_CompilerCtor;
  NonPOD_UserCtor * c = new NonPOD_UserCtor;

  //...

  PlainOldData * d = new PlainOldData();
  NonPOD_CompilerCtor * e = new NonPOD_CompilerCtor();
  NonPOD_UserCtor * f = new NonPOD_UserCtor();

  //...
}
</pre></p>
<p>Os valores que esperava para o membro <code>id_</code> são os seguintes:</p>
<ul>
<li><strong>a</strong> &#8211; O objeto é criado sem parêntesis e o tipo é POD. Logo, não há inicialização e o valor de <code>id_</code> é indeterminado.</li>
<li><strong>b</strong> &#8211; O objeto é criado sem parêntesis e o tipo é não-POD. Logo, a inicialização é padrão. No entanto, o construtor é o gerado pelo compilador, o qual não faz inicialização de nenhum membro. Portanto, o valor de <code>id_</code> é indeterminado.</li>
<li><strong>c</strong> &#8211; O objeto é criado sem parêntesis e o tipo é não-POD. Novamente, temos inicialização padrão. Agora, com a diferença de que existe um construtor definido pelo usuário que inicializa explicitamente <code>id_</code>. Este, então, sofre inicialização por valor, a qual resulta em inicialização por zeros devido ao fato de <code>int</code> ser POD.</li>
<li><strong>d</strong> &#8211; O objeto é criado com parêntesis vazios e, assim como nos outros dois casos abaixo, a inicialização é por valor. Este caso se trata de um POD. Logo, a inicialização por valor resulta diretamente em inicialização por zeros.</li>
<li><strong>e</strong> &#8211; Como dito acima, o objeto sofre inicialização por valor, já que foi criado com parêntesis vazios. O membro <code>id_</code> também sofre inicialização por valor que, devido ao fato de se tratar de um POD, resulta em inicialização por zeros.</li>
<li><strong>f</strong> &#8211; Novamente, inicialização por valor. Naturalmente, o construtor definido pelo usuário é invocado. Este inicializa por valor o membro <code>id_</code>, que por ser um POD sofre inicialização por zeros.</li>
</ul>
<p>Testando com compiladores diferentes obtive os seguintes resultados.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr style="text-align:center;">
<td width="83" valign="top"><em><strong>Compilador</strong></em></td>
<td width="83" valign="top"><strong>a</strong></td>
<td width="83" valign="top"><strong>b</strong></td>
<td width="83" valign="top"><strong>c</strong></td>
<td width="83" valign="top"><strong>d</strong></td>
<td width="83" valign="top"><strong>e</strong></td>
<td width="83" valign="top"><strong>f</strong></td>
</tr>
<tr>
<td width="83" valign="top">G++ 4.2.4</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
</tr>
<tr>
<td width="83" valign="top">Mingw – G++ 4.4.0</td>
<td style="text-align:center;" width="83" valign="top">Indeterm.</td>
<td style="text-align:center;" width="83" valign="top">Indeterm.</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
</tr>
<tr>
<td width="83" valign="top">VC++ 2008 Express</td>
<td style="text-align:center;" width="83" valign="top">Indeterm.</td>
<td style="text-align:center;" width="83" valign="top">Indeterm.</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
</tr>
<tr>
<td width="83" valign="top">Digital Mars 8.5.1</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">Indeterm.</td>
<td style="text-align:center;" width="83" valign="top">0</td>
<td style="text-align:center;" width="83" valign="top">0</td>
</tr>
</tbody>
</table>
<p>Para completar a avaliação também resolvi utilizar sintaxes correspondentes às usadas acima só que com alocação na pilha.</p>
<p><pre class="brush: cpp;">
int main()
{
  PlainOldData aa;
  NonPOD_CompilerCtor bb;
  NonPOD_UserCtor cc;

  //...

  PlainOldData const&amp; dd = PlainOldData();
  NonPOD_CompilerCtor const&amp; ee = NonPOD_CompilerCtor();
  NonPOD_UserCtor const&amp; ff = NonPOD_UserCtor();

  //...
}
</pre></p>
<p>Já que nesses casos o fator determinante na inicialização é a presença ou não dos parêntesis, esperava obter exatamente os mesmos resultados do código anterior. Apenas uma observação: As referências para <code>const</code> dos últimos três casos são apenas uma estratégia artificial para testar a inicialização através da expressão <code>X()</code>, já que <code>X x();</code> é na verdade a declaração de uma função que não recebe parâmetros e retorna <code>X</code>.</p>
<p>Desta vez os resultados foram os seguintes:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr style="text-align:center;">
<td width="83" valign="top">
<p style="text-align:center;"><em><strong>Compilador</strong></em></p>
</td>
<td width="83" valign="top">
<p style="text-align:center;"><strong>aa</strong></p>
</td>
<td width="83" valign="top">
<p style="text-align:center;"><strong>bb</strong></p>
</td>
<td width="83" valign="top">
<p style="text-align:center;"><strong>cc</strong></p>
</td>
<td width="83" valign="top">
<p style="text-align:center;"><strong>dd</strong></p>
</td>
<td width="83" valign="top">
<p style="text-align:center;"><strong>ee</strong></p>
</td>
<td width="83" valign="top">
<p style="text-align:center;"><strong>ff</strong></p>
</td>
</tr>
<tr>
<td width="83" valign="top">G++ 4.2.4</td>
<td width="83" valign="top">
<p style="text-align:center;">Indeterm.</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">Indeterm.</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">0</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">0</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">0</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">0</p>
</td>
</tr>
<tr style="text-align:center;">
<td width="83" valign="top">
<p style="text-align:left;">Mingw – G++ 4.4.0</p>
</td>
<td width="83" valign="top">Indeterm.</td>
<td width="83" valign="top">Indeterm.</td>
<td width="83" valign="top">0</td>
<td width="83" valign="top">0</td>
<td width="83" valign="top">0</td>
<td width="83" valign="top">0</td>
</tr>
<tr>
<td width="83" valign="top">VC++ 2008 Express</td>
<td width="83" valign="top">
<p style="text-align:center;">Indeterm.</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">Indeterm.</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">0</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">0</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">Indeterm.</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">0</p>
</td>
</tr>
<tr>
<td width="83" valign="top">Digital Mars 8.5.1</td>
<td width="83" valign="top">
<p style="text-align:center;">Indeterm.</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">Indeterm.</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">0</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">Indeterm.</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">0</p>
</td>
<td width="83" valign="top">
<p style="text-align:center;">0</p>
</td>
</tr>
</tbody>
</table>
<p>Bom, como pode ser visto encontrei muitas variações de comportamento entre os compiladores. Espero não ter cometido alguma interpretação errônea pelos meandros do padrão, mas os únicos compiladores que foram conformantes na primeira leva de testes foram o G++ 4.4.0 (Mingw) e o Visual C++ 2008. Já para a segunda parte, na qual esperava exatamente os mesmos resultados, apenas o G++ 4.4.0.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/337/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/337/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/337/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/337/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/0xc0de.wordpress.com/337/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/0xc0de.wordpress.com/337/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/0xc0de.wordpress.com/337/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/0xc0de.wordpress.com/337/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/337/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/337/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/337/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/337/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/337/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/337/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=337&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://0xc0de.wordpress.com/2010/04/05/zero-default-value_initialization/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/965e41270dfe683efccaf4c4c26e6a14?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">0xc0de</media:title>
		</media:content>
	</item>
		<item>
		<title>Opções para leitura de um arquivo inteiro</title>
		<link>http://0xc0de.wordpress.com/2009/10/17/opcoes-para-leitura-de-um-arquivo-inteiro/</link>
		<comments>http://0xc0de.wordpress.com/2009/10/17/opcoes-para-leitura-de-um-arquivo-inteiro/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 13:51:25 +0000</pubDate>
		<dc:creator>0xc0de</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[arquivos]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[IOStreams]]></category>
		<category><![CDATA[stl]]></category>
		<category><![CDATA[strings]]></category>

		<guid isPermaLink="false">http://0xc0de.wordpress.com/?p=323</guid>
		<description><![CDATA[Então, quais são as opções para lermos um arquivo inteiro para memória (armazenando-o em uma std::string, por exemplo) em C++? O programa abaixo ilustra algumas alternativas simples. Outras idéias?<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=323&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Então, quais são as opções para lermos um arquivo inteiro para memória (armazenando-o em uma <code>std::string</code>, por exemplo) em C++? O programa abaixo ilustra algumas alternativas simples.</p>
<p><pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
#include &lt;iterator&gt;
#include &lt;string&gt;

void stringstream_read_file();
void istream_iterator_read_file();
void istreambuf_iterator_read_file();

int main()
{
  //Lê copiando o buffer file stream para o string stream.
  stringstream_read_file();

  //Lê iterando pelo stream e fazendo extração com operator&gt;&gt;.
  istream_iterator_read_file();

  //Lê iterando diretamente pelo buffer e copiando caracteres.
  istreambuf_iterator_read_file();

  return 0;
}

void stringstream_read_file()
{
  std::ifstream fs(&quot;file.txt&quot;);
  if (!fs.good())
    std::cout &lt;&lt; &quot;Error.&quot; &lt;&lt; std::endl;
  else
  {
    std::ostringstream ss;
    ss &lt;&lt; fs.rdbuf();
    std::cout &lt;&lt; ss.str() &lt;&lt; std::endl;
  }
}

void istream_iterator_read_file()
{
  std::ifstream fs(&quot;file.txt&quot;);
  if (!fs.good())
    std::cout &lt;&lt; &quot;Error.&quot; &lt;&lt; std::endl;
  else
  {
    fs.unsetf(std::ios_base::skipws); //Para manter os espaços.
    std::string s((std::istream_iterator&lt;char&gt;(fs)), std::istream_iterator&lt;char&gt;());
    std::cout &lt;&lt; s &lt;&lt; std::endl;
  }
}

void istreambuf_iterator_read_file()
{
  std::ifstream fs(&quot;file.txt&quot;);
  if (!fs.good())
    std::cout &lt;&lt; &quot;Error.&quot; &lt;&lt; std::endl;
  else
  {
    std::string s((std::istreambuf_iterator&lt;char&gt;(fs)), std::istreambuf_iterator&lt;char&gt;());
    std::cout &lt;&lt; s &lt;&lt; std::endl;
  }
}
</pre></p>
<p>Outras idéias? </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/0xc0de.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/0xc0de.wordpress.com/323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/0xc0de.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/0xc0de.wordpress.com/323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/323/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=323&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://0xc0de.wordpress.com/2009/10/17/opcoes-para-leitura-de-um-arquivo-inteiro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/965e41270dfe683efccaf4c4c26e6a14?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">0xc0de</media:title>
		</media:content>
	</item>
		<item>
		<title>Basic basic_string String Utils</title>
		<link>http://0xc0de.wordpress.com/2009/09/13/basic-basic_string-string-utils/</link>
		<comments>http://0xc0de.wordpress.com/2009/09/13/basic-basic_string-string-utils/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 01:50:01 +0000</pubDate>
		<dc:creator>0xc0de</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[programação genérica]]></category>
		<category><![CDATA[strings]]></category>
		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://0xc0de.wordpress.com/?p=313</guid>
		<description><![CDATA[Vários programadores C++ devem concordar que a interface do template std::basic_string [1] não é das mais ricas. Provavelmente, muitos já até criaram suas próprias funções utilitárias para lidar com strings. Eu resolvi publicar as minhas. A pequena coleção de algoritmos em string não é tão poderosa e completa como a Boost String Algorithms Library. Também [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=313&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Vários programadores C++ devem concordar que a interface do template <code>std::basic_string</code> [1] não é das mais ricas. Provavelmente, muitos já até criaram suas próprias funções utilitárias para lidar com strings. Eu resolvi publicar as minhas. </p>
<p>A pequena coleção de algoritmos em string não é tão poderosa e completa como a <a href="http://www.boost.org/doc/libs/1_40_0/doc/html/string_algo.html">Boost String Algorithms Library</a>. Também não é tão genérica quanto a da Boost. Isso, por que eu assumo que todos os tipos devem ser instâncias do template <code>std::basic_string</code>. Mesmo assim, ainda podem ter situações que compensem seu uso.</p>
<ul>
<li>Se você está trabalhando com ASCII [2], há versões das funções que aceitam qualquer tipo que seja uma instância do template <code>std::basic_string</code> parametrizado com <code>char</code> e <code>std::char_traits&lt;char&gt;</code> como sendo os dois primeiros argumentos template (o alocador não importa). Essas versões não utilizam os mecanismos de localização/internacionalização de C++, mas apenas uma tabela de conversões. Normalmente, isso permite um processamento mais rápido, já que não são realizadas chamadas de métodos virtuais das classes de facets [3]. Naturalmente, para outros encodings existem versões que aceitam um <code>std::locale</code>.</li>
<li>Caso não esteja usando a Boost em sua aplicação, pode ser que não queira adicioná-la apenas por necessitar de algumas funções utilitárias para strings.</li>
</ul>
<p>Bom, uma pequena introdução sobre minha <strong>Basic <code>basic_string</code> String Utils</strong> (que na verdade é uma versão em inglês deste texto) e o download estão disponíveis em<a href="http://sites.google.com/site/ltcmelo/basic-string-utils"> meu site</a>.</p>
<p>[1] Para os que ainda não sabem, ambos os tipos <code>std::string</code> e <code>std::wstring</code> são instâncias do template <code>std::basic_string</code>.</p>
<p>[2] Refiro-me ao ASCII convencional de 7 bits, e não extensões como ISO-8859-x.</p>
<p>[3] O mecanismo de internacionalização em C++ (locales) é constituído por uma coleção de templates e classes especiais chamadas de facets.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/313/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/313/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/0xc0de.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/0xc0de.wordpress.com/313/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/0xc0de.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/0xc0de.wordpress.com/313/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/313/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/313/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/313/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/313/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=313&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://0xc0de.wordpress.com/2009/09/13/basic-basic_string-string-utils/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/965e41270dfe683efccaf4c4c26e6a14?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">0xc0de</media:title>
		</media:content>
	</item>
		<item>
		<title>Entendendo o papel de std::iterator_traits</title>
		<link>http://0xc0de.wordpress.com/2009/08/10/iterator_traits/</link>
		<comments>http://0xc0de.wordpress.com/2009/08/10/iterator_traits/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 00:38:37 +0000</pubDate>
		<dc:creator>0xc0de</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[concepts]]></category>
		<category><![CDATA[programação genérica]]></category>
		<category><![CDATA[stl]]></category>
		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://0xc0de.wordpress.com/?p=293</guid>
		<description><![CDATA[Um dos fóruns de desenvolvimento C++ que mais gosto é o Codeguru. De vez em quando participo de umas discussões por lá. Semana passada, por exemplo, surgiu um assunto que costuma gerar certas dúvidas. Principalmente, para quem não é muito por dentro do design da STL. Quais os requisitos que tornam uma classe de iteração [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=293&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Um dos fóruns de desenvolvimento C++ que mais gosto é o <a href="http://codeguru.earthweb.com/forum/forumdisplay.php?f=41">Codeguru</a>. De vez em quando participo de umas discussões por lá. Semana passada, por exemplo, surgiu um assunto que costuma gerar certas dúvidas. Principalmente, para quem não é muito por dentro do design da STL.</p>
<ul>
<li>Quais os requisitos que tornam uma classe de iteração (um <em>iterator</em>) compatível com os algoritmos da STL?</li>
<li>Quais devem ser os cuidados ao implementar um algoritmo para que ele seja compatível com os iteradores da STL?</li>
</ul>
<p>Bom, as respostas são relativamente simples. Nada mirabolante. Explicações breves seguem abaixo. Mas se alguém quiser ler a discussão original do Codeguru para entender melhor o contexto, os links são <a href="http://codeguru.earthweb.com/forum/showthread.php?t=482165">este</a> e <a href="http://codeguru.earthweb.com/forum/showthread.php?t=482297">este</a>.</p>
<p>Vamos para a primeira pergunta. Talvez você tenha criado uma nova estrutura de dados e esteja implementando um iterador para ela. Ou talvez tenha apenas inventado um mecanismo de iteração específico. Por qualquer que seja o motivo, se você tem uma classe de iteração e precisa fazê-la funcionar na STL é necessário seguir algumas diretrizes.</p>
<p>Como sabemos, os iteradores da STL são responsáveis por fazer a &#8220;cola&#8221; entre os contêineres e os algoritmos. Logo, a definição dos tipos de dados sobre os quais as operações são realizadas é de responsabilidade do iterador. A STL se apoia em um template, <code>std::iterator_traits</code>, para encapsular essa informação. Sua definição é a seguinte:</p>
<p><pre class="brush: cpp;">
template&lt;class iterator_t&gt; 
struct iterator_traits 
{
  typedef typename iterator_t::difference_type difference_type;
  typedef typename iterator_t::value_type value_type;
  typedef typename iterator_t::pointer pointer;
  typedef typename iterator_t::reference reference;
  typedef typename iterator_t::iterator_category iterator_category;
};
</pre></p>
<p>O template <em>std::iterator_traits</em> deve possuir uma instanciação válida para todas as classes que representam iteradores, pois os algoritmos dependem dos tipos inferidos para que possam funcionar corretamente. Existem duas maneiras de fazer isso. Uma delas (normalmente recomendada) é definir os tipos acima através de <code>typedef</code>s dentro da própria classe. </p>
<p><pre class="brush: cpp;">
class smart_iterator
{
public:
  typedef something value_type;
  typedef something * pointer;
  //...
};
</pre></p>
<p>A maneira alternativa é especializar o template <code>std::iterator_traits</code> e lá fazer a definição dos tipos. Essa é exatamente a abordagem que o próprio padrão C++ adota para que ponteiros comuns funcionem como iteradores. Portanto, a especialização de <code>std::iterator_traits</code> para ponteiros já vem de fábrica.  </p>
<p><pre class="brush: cpp;">
//Especialização para ponteiros (existe uma similar para ponteiros de constantes).
template&lt;class T&gt; 
struct iterator_traits&lt;T*&gt; 
{
  typedef ptrdiff_t difference_type; 
  typedef T value_type;
  typedef T* pointer;
  typedef T&amp; reference;
  typedef random_access_iterator_tag iterator_category;
};

//Especialização para sua classe.
template &lt;&gt;
struct iterator_traits&lt;smart_iterator&gt;
{
  typedef something value_type;
  typedef something * pointer;
  //...
};
</pre></p>
<p>Ainda não acabou. Tendo estabelecido os tipos, você precisa se certificar de que a classe de iteração <em>satisfaz</em> as <em>expressões válidas</em> do <em>conceito</em> de iterador que se deseja <em>modelar</em>. Todos os iteradores devem suportar, por exemplo, o operador de dereferenciação (<code>operator*</code>) e o operador de acesso a membro (<code>operator-&gt;</code>). Mas alguns conceitos como <a href="http://www.sgi.com/tech/stl/BidirectionalIterator.html">Bidirectional Iterator</a> ou <a href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random Access Iterator</a> adicionam novos requisitos. </p>
<p>A resposta para a segunda pergunta é bem intuitiva tendo-se em vista os comentários acima. Quando quiser implementar um algoritmo no estilo STL, lembre-se de dois pontos importantes:</p>
<ul>
<li>Algoritmos operam através de iteradores. Acesso aos tipos de dados devem ser sempre feitos com o auxílio de <code>std::iterator_traits</code>. Nunca acesse o tipo diretamente através do parâmetro template correspondente ao iterador.</li>
<p><pre class="brush: cpp;">
template &lt;class input_iterator_t&gt;
void cool_algorithm(input_iterator first, input_iterator last)
{
  //Não faça assim!
  typename input_iterator_t::value_type a; 

  //Faça assim!
  typename std::iterator_traits&lt;input_iterator_t&gt;::value_type b;
  
  //...
}
</pre></p>
<li>Deixe claro na documentação qual o conceito esperado que o iterador modele. Obviamente, utilize apenas as expressões desse conceito (ou de conceitos que ele refina). Não utilize, por exemplo, a expressão <code>--i</code> (assumindo que <code>i</code> seja um iterador) em uma implementação que espera um <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">Forward Iterator</a>, já que ela só é válida para um <a href="http://www.sgi.com/tech/stl/BidirectionalIterator.html">Bidirectional Iterator</a>.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/0xc0de.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/0xc0de.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/0xc0de.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/0xc0de.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/293/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/293/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/293/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=293&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://0xc0de.wordpress.com/2009/08/10/iterator_traits/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/965e41270dfe683efccaf4c4c26e6a14?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">0xc0de</media:title>
		</media:content>
	</item>
		<item>
		<title>Construtor de cópia e operador de atribuição</title>
		<link>http://0xc0de.wordpress.com/2009/06/27/construtor-de-copia-e-operador-de-atribuicao/</link>
		<comments>http://0xc0de.wordpress.com/2009/06/27/construtor-de-copia-e-operador-de-atribuicao/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 18:30:21 +0000</pubDate>
		<dc:creator>0xc0de</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[operadores]]></category>

		<guid isPermaLink="false">http://0xc0de.wordpress.com/?p=274</guid>
		<description><![CDATA[Sugestão de implementação do construtor de cópia e operador de atribuição em C++: Crie um construtor de cópia com passagem de parâmetro por referência para uma constante. Crie um operador de atribuição com passagem de parâmetro por valor e retorno por referência. Crie uma função membro de swap. Idealmente, que não lance exceções. Dentro do [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=274&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sugestão de implementação do construtor de cópia e operador de atribuição em C++:</p>
<ul>
<li>Crie um construtor de cópia com passagem de parâmetro por referência para uma constante.</li>
<li>Crie um operador de atribuição com passagem de parâmetro por valor e retorno por referência.</li>
<li>Crie uma função membro de <em>swap</em>. Idealmente, que não lance exceções.</li>
<li>Dentro do operador de atribuição, faça a troca (<em>swap</em>) entre o argumento construído por cópia e o objeto apontado por <code>this</code>.</li>
</ul>
<p>Essa é uma solução elegante e sem redundâncias (considerando que todos os <em>swaps</em> estejam corretamente implementados). Além disso, não depende da verificação de auto-atribuição no <code>operator=</code>. Para detalhes relacionados a <em>exception-safety</em>, clique <a href="http://www.gotw.ca/gotw/059.htm">aqui</a>.</p>
<p><pre class="brush: cpp;">
class person
{
public:
    person(std::string name);
    person(person const&amp; other); //Construtor cópia.
    person &amp; operator=(person other); //Operador atribuição.

    void swap(person &amp; other) throw();

private:
    std::string name_;
    unsigned short age_;
    /* ... */
};

person::person(std::string name):
  name_(name), age_(0) /* ... */
{}

person::person(person const&amp; other):
  name_(other.name_), age_(other.age_) /* ... */
{}

person &amp; person::operator=(person other)
{
    other.swap(*this); //Troca com a cópia recebida.
    return *this;
}

void person::swap(person &amp; other) throw()
{
    name_.swap(other.name_);
    std::swap(age_, other.age_);
    /* ... */
}
</pre></p>
<p>Lembre que nem sempre é necessário declarar/definir esses membros para todas as classes. O código acima visa apenas ilustrar uma forma de implementação.</p>
<p align='right'>Leandro T. C. Melo</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/0xc0de.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/0xc0de.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/0xc0de.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/0xc0de.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/274/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=274&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://0xc0de.wordpress.com/2009/06/27/construtor-de-copia-e-operador-de-atribuicao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/965e41270dfe683efccaf4c4c26e6a14?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">0xc0de</media:title>
		</media:content>
	</item>
		<item>
		<title>Heap e/ou Free Store &#8211; Áreas de Memória C++</title>
		<link>http://0xc0de.wordpress.com/2009/05/24/cppmemory/</link>
		<comments>http://0xc0de.wordpress.com/2009/05/24/cppmemory/#comments</comments>
		<pubDate>Sun, 24 May 2009 16:17:20 +0000</pubDate>
		<dc:creator>0xc0de</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[memória]]></category>

		<guid isPermaLink="false">http://0xc0de.wordpress.com/?p=245</guid>
		<description><![CDATA[Alocação de memória é assunto importante em C++. No entanto, nem todo mundo sabe exatamente como as coisas acontecem. Quantos de vocês já não viram códigos carregados de new/delete em situações nas quais objetos de pilha seriam suficientes ou mais indicados? O livro Exceptional C++ (Herb Sutter) tem vários tópicos sobre gerenciamento de memória. Inclusive, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=245&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Alocação de memória é assunto importante em C++. No entanto, nem todo mundo sabe exatamente como as coisas acontecem. Quantos de vocês já não viram códigos carregados de <code>new/delete</code> em situações nas quais objetos de pilha seriam suficientes ou mais indicados?</p>
<p>O livro <a href="http://www.gotw.ca/publications/xc++.htm">Exceptional C++ (Herb Sutter)</a> tem vários tópicos sobre gerenciamento de memória. Inclusive, com uma tabelinha bem bacana que descreve as áreas de memória de um programa C++. O detalhe, talvez um pouco polêmico, é que é feita uma distinção entre o <em>heap</em> e o <em>free store</em> (espaço livre para armazenamento). Tentarei explicar.</p>
<p>Creio que todos sabem que a alocação dinâmica é mais cara que na pilha. Ou seja, o uso do <em>new</em> e <em>delete</em> implica em solicitação e devolução de memória ao sistema operacional durante execução do programa. A consequência disso é um preço, em termos de eficiência, maior do que aquele de um objeto criado por valor na pilha. Obviamente, o <em>new</em> é necessário em inúmeros casos. Mas de onde vem essa memória?</p>
<p>Provavelmente, alguns respoderam <em>heap</em>. Outros responderam <em>free store</em>. Há ainda os que dizem que ambos são exatamente a mesma coisa. Então, existe um veredito?</p>
<p>O padrão C++ não utiliza a palavra <em>heap</em> em nenhum momento com relação à memória. Esse termo só aparece no contexto da STL com a conotação da conhecida <a href="http://en.wikipedia.org/wiki/Heap_(data_structure)">estrutura de dados</a>. No que diz respeito a alocação dinâmica, está presente apenas o conceito de <em>free store</em>. É de lá que vem a memória dinâmica de um <code>new</code>. Do ponto de vista prático, porém, o <em>free store</em> normalmente corresponde justamente ao que é chamado de <em>heap</em> nos sistemas. Portanto, apesar de certa confusão (ou mal entendido), considero que a forma <strong>oficial</strong> de se refereir a origem da memória obtida por <code>new</code> seja através de <em>free store</em>. Mas também considero totalmente aceitável que o <em>heap</em> e o <em>free store</em> sejam, de fato, o mesmo lugar.</p>
<p>Uma das origens dessa confusão é que Herb Sutter menciona no livro que o <em>free store</em> é a área de memória dinâmica utilizada por <code>new/delete</code>. Enquanto que o <em>heap</em> é área de memória utilizado pelas funções <code>malloc/free</code>. Não tenho o padrão de C em minhas mãos, mas realmente gostaria de saber se ele utiliza a palavra <em>heap</em> com o significado de área de memória. Por acaso, alguém sabe?</p>
<p>De qualquer maneira, há uma <a href="http://zamanbakshifirst.blogspot.com/2007/02/c-free-store-versus-heap.html">mensagem bem esclarecedora</a> na Intenet em que Bjarne Stroustrup tenta explicar por que foi feita a distinção entre <em>heap</em> e <em>free store</em> por Herb Sutter. De acordo com ele, a idéia era simplesmente deixar claro que uma alocação feita por <code>malloc</code> é diferente de uma alocação feita por <code>new</code>, o que faz sentido total.</p>
<p>Uau&#8230; Depois de toda essa discussão deixo um breve resumo da tabela de <em>Exceptional C++</em> que descreve as 5 áreas de memória de um programa C++. A tabela detalhada também pode ser encontrada em <a href="http://www.gotw.ca/gotw/009.htm">GotW</a>.</p>
<p><b>const data</b> &#8211; Armazena literais de strings e outros valores <em>read-only</em> conhecidos em tempo de compilação, os quais duram durante toda a execução do programa.</p>
<p><b>pilha</b> &#8211; Área de variáveis automáticas.</p>
<p><b>free store</b> &#8211; Memória dinâmica alocada/liberada por <code>new/delete</code>.</p>
<p><b>heap</b> &#8211; Memória dinâmica alocada/liberada por <code>malloc/free</code>.</p>
<p><b>global/static</b> &#8211; Armazena dados globais e estáticos, os quais são inicializados quando o programa começa a executar.</p>
<p>Bom, espero ter sido útil.</p>
<p align="right">Leandro T. C. Melo</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/0xc0de.wordpress.com/245/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/0xc0de.wordpress.com/245/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/0xc0de.wordpress.com/245/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/0xc0de.wordpress.com/245/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/0xc0de.wordpress.com/245/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/0xc0de.wordpress.com/245/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/0xc0de.wordpress.com/245/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/0xc0de.wordpress.com/245/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/0xc0de.wordpress.com/245/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/0xc0de.wordpress.com/245/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/0xc0de.wordpress.com/245/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/0xc0de.wordpress.com/245/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/0xc0de.wordpress.com/245/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/0xc0de.wordpress.com/245/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=0xc0de.wordpress.com&amp;blog=4499285&amp;post=245&amp;subd=0xc0de&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://0xc0de.wordpress.com/2009/05/24/cppmemory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/965e41270dfe683efccaf4c4c26e6a14?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">0xc0de</media:title>
		</media:content>
	</item>
	</channel>
</rss>
