2017/06/22

[c/c++]引数が多いことに対する抵抗が薄れてきた

関数を作るとき、あまり引数が多いのはよろしくない、と教えられて育って(?)きた。

もちろんそれには理由があり、C/C++コンパイラはある程度の数までは引数をCPUのレジスタで引き渡し、それ以上になるとスタックメモリに入れて引き渡すからだ。
C言語の規格書を読んだことがないので決まりなのかどうかは知らないが、メーカー製のコンパイラ仕様なんかを読むとだいたいそうなっていた。


これはARM Cortex-AのARMv8-Aのようだが、Argument registersということで8つ確保してある。。。のだと思う。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/ch09s01s01.html

別の環境で、Cだと4つまで、C++だと3つまではレジスタ渡しするというのも読んだことがある(thisで1つ取られるからね)。
CPUによってレジスタの数や使い方が違うだろうから、全部同じではないだろう。


以前はけっこう気にしていたのだが、そんなに効果があるのかも気になっていた。
引数をたくさん与えないといけない関数は、だいたい使用頻度が少ないものが多かったからだ。
使用頻度があまりにも多い場合は、マクロ関数なりinline関数にするとそこそこ対応できるし(ROM容量との兼ね合いにもなるが)、みんなが使うのでstaticなどでグローバル変数にしているから渡す必要がなかったり。

引数を渡すということは、モジュールと切り離したいという意思が強いだろうから、そういうのはstructにして渡せるようにし、グローバル変数みたいにして保持するときもstructのままで持っておくと渡しやすい。


いや、何の話をしているかというと、引数が多いのはよろしくない→じゃあstructを用意して代入してポインタで渡す、などということを自分でやっていたからだ。
それって、スタックにためて渡すのとあんまり内容として変わらないけど、実装の手間だけ増えてるよな、と漠然と思っていたのだ。

そんなことをするくらいだったら引数が多いままの関数を作ってもよいし、そもそもそういう関数を作らなくていいような構造にできるした方が効率いいんじゃないの、という「引数が多いのはよろしくない」という警告だったのかもしれない。


そんなことを自分で作った引数8個の関数を見ながら思った。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。