<?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/"
	>

<channel>
	<title>ものぐさ備忘録 &#187; 最適化</title>
	<atom:link href="http://www.ginriki.net/wd/category/%e6%9c%80%e9%81%a9%e5%8c%96/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ginriki.net/wd</link>
	<description>ソフトウェア関係の話を中心とした備忘録的日記</description>
	<lastBuildDate>Sun, 16 Jan 2011 20:07:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>最適化のトリビア</title>
		<link>http://www.ginriki.net/wd/2007/06/21/20/</link>
		<comments>http://www.ginriki.net/wd/2007/06/21/20/#comments</comments>
		<pubDate>Wed, 20 Jun 2007 22:42:52 +0000</pubDate>
		<dc:creator>ginriki</dc:creator>
				<category><![CDATA[最適化]]></category>

		<guid isPermaLink="false">http://www.gikogeek.net/wd/?p=20</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div class="section">
<p>以下のコードがあったとします。</p>
<pre class="syntax-highlight">
<span class="synPreProc">#include </span><span class="synConstant">&#60;stdio.h&#62;</span>

<span class="synType">int</span> main(<span class="synType">int</span> argc, <span class="synType">char</span>* argv[]){
<span class="synType">int</span> i;
<span class="synStatement">if</span>(argc &#62; <span class="synConstant">1</span>){
i = <span class="synConstant">10</span>;
}

printf(<span class="synConstant">&#34;i = </span><span class="synSpecial">%d\n</span><span class="synConstant">&#34;</span>, i);
<span class="synStatement">return</span> <span class="synConstant">0</span>;
}
</pre>
<p>これをgcc 4.1.1でコンパイルして実行すると以下のようになります。</p>
<pre class="syntax-highlight">
<span class="synPreProc">$gcc</span> <span class="synSpecial">-O2</span> main.c
$./a.out
<span class="synConstant">10</span>        <span class="synStatement">&#60;</span>-------注目
$./a.out <span class="synConstant">1</span>
<span class="synConstant">10</span>
$./a.out <span class="synConstant">1</span> <span class="synConstant">2</span>
<span class="synConstant">10</span>
</pre>
<p>このような結果になるのには、ちゃんとした理由があります(コンパイラの視点にたった場合）。</p>
<p>iに対する代入がない段階において、iの値が何であるかは、Cレベルでは未定義です。これは、代入がない間のiの値をコンパイラが勝手に設定しても問題ないということを意味します。よって、コンパイル時に上のコードを以下のように読み替えても問題ないです。</p>
<pre class="syntax-highlight">
<span class="synType">int</span> main(<span class="synType">int</span> argc, <span class="synType">char</span>* argv[]){
<span class="synType">int</span> i = <span class="synConstant">10</span>;
<span class="synStatement">if</span>(argc &#62; <span class="synConstant">1</span>){
i = <span class="synConstant">10</span>;
}

printf(<span class="synConstant">&#34;i = </span><span class="synSpecial">%d\n</span><span class="synConstant">&#34;</span>, i);
<span class="synStatement">return</span> <span class="synConstant">0</span>;
}
</pre>
<p>このコードを最適化すると以下のコードになります。</p>
<pre class="syntax-highlight">
<span class="synType">int</span> main(<span class="synType">int</span> argc, <span class="synType">char</span>* argv[]){
printf(<span class="synConstant">&#34;i = </span><span class="synSpecial">%d\n</span><span class="synConstant">&#34;</span>, <span class="synConstant">10</span>);
<span class="synStatement">return</span> <span class="synConstant">0</span>;
}
</pre>
<p>よって、a.outのコマンドライン引数に何も与えなくても(argc == 1でも）10が出力されます。</p>
<p>１へぇ。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ginriki.net/wd/2007/06/21/20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

