C++ インライン関数
C++の絵本を読んでいてインライン関数の場合の方が
よい場合もあるという記述があるが、具体的なケースの説明が
なかった。
とりあえず実験してみるも、単純な10000回のfor文に対して、
それぞれの場合でみてみるも、あまり差はみられず。
関数化しない場合 0.000056
関数化した場合 0.000059
インライン関数化した場合 0.000059
参考;http://www.mm2d.net/c/c-02.shtml
確かに早いがこれくらいだとそんなに違いがない。
計算量を比較の軸として考え、10000回ではなく、
O(N),O(logN),O(N~2)でそれぞれ計算してみる。
O(N)は上記の結果とする。
O(logN)は上記より差が少なくなる。
O(N^2)(N=100000000の場合)は
関数化しない場合 0.275509
関数化した場合 0.281236
インライン関数化した場合 0.277868
となり、この程度の計算量の違いでも極端な違いは出ない。
■呼び出しの回数を3倍とした場合
O(N^2)(N=100000000の場合)
関数化しない場合 0.839748
関数化した場合 0.850773
インライン関数化した場合 0.831881
ここでインライン化した場合が関数化しない場合を超えるという形となり、これくらいの規模になると、インライン化の恩恵が具体的に
見えてくるのではないかと考える。
mac 開発環境
先々週にMacBookPro(2008mid)からMacBookAir(2013mid)に乗り換えたのですが、
環境は引きつかず、新規のまま使用しているため、いろいろと環境が整っていなかったりする。
特に、Macへのインストールするためのツールが整っていなかったりして、
意識せずにyumとか使って、そもそもないよとか、Macでインストールするのも
そもそもだいぶ久しぶりで忘れていたので調べてみた。
とても参考になったのは下記のスライド。
http://www.slideshare.net/TomohikoHimura/ss-20115472
これをみて、homebrewを入れてみようかと考えたり。
理由は単純にはやってそうだから。
個人的にはlinuxと同じでyumが使えるようになってほしいと思ったり。
command line toolsのインストールが必要とあり以下の2つの方法で可能とあり。
1.Xcodeからインストール
参照 http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc
2.Developerからダウンロード
1.は現在のXcode5.0.1から出来なかったので、2.の方法で実施。
インストール後にターミナルから以下のコマンドを実行。
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
パスワードの入力を求められたけどユーザのパスワードを入力でパス。
そういえばsudoのパスワードって設定が必要じゃなかったけか。
無事インストールされたら今回の目的であったnode.jsをインストール。
brew install node.js
すぐに終わり。よかったよかった。
C++ #1
cocos2dでアプリを作るにあたり、C++の基礎すらなかったので、急ぎ参考書を購入。
購入したのは「C++の絵本」。
図が多く初心者向けでかつCの知識があることが前提なので、ちょうど良かった。
Objective-Cは触っていたので、オブジェクト指向の考え方は比較的わかりやすかった。
というかC++の方が基本はわかりやすいのかな。
-C++とCの差異
- 変数宣言の位置はブロック内の先頭でなくてもよい
->これって逆に先頭でなきゃ行けない意識がなかった。
調べてみると関数などで使うローカル変数は先頭でないといけないらしい
知らなかったけど、その場合は大抵先頭でしてるなぁ。
- const指定したポインタには代入できない
->代入できるとconstで指定した値も変更できてしまうため不可
const char *buf;
char *ptr;
ptr = buf;
ptr[0] = 'b'; //buf[0]もbに入れ替わってしまう。
- デフォルト引数の指定の仕方
->あまり使わないようで使いそうなので参考になった。
デフォルト値は先頭の引数だけ指定することは不可であり、
かならず後ろの方の引数から指定する必要がある。
LISP
LISPの勉強として「初めての人のためのLISP/竹内郁雄著」を読み始めた。
あまり参考書らしくないが、とても丁寧に書かれているのでわかりやすい。
読み終えたらまとめて書く。
とりあえず
car : リストの頭を抜いたもの
cdr : リストの頭を抜いた残り。()の残っている方。
nil : 空リスト、述語関数の偽の場合の返り値
t : 述語関数の正の場合の返り値
述語関数 : 真偽値を返す関数
atom : 引数がatomの場合にtを返し、そうでない場合nilを返す。
null : 引数がnullの場合にtを返し、そうでない場合nilを返す。
set : 第1引数の変数に第2引数の代入(束縛?)する。
setq:setと同様だが、setの場合は第1引数を評価したくない場合"`"で囲む必要があったが、こちらはその必要がない。
eq : 第1引数と第2引数が同一の場合tを返し、そうでない場合nilを返す。
list : 指定した引数からリストを作る。
cons : 第1引数をcar、第2引数をcdrとして新しいリストを作る。
LISPの変数にグローバルとかプライベートとかあるんだろか。
gitのセットアップ
git+Dropboxのセットアップが完了した。参考にしたのは
http://nigohiroki.hatenablog.com/entry/2012/09/25/232843
https://cybozu.atlassian.net/wiki/pages/viewpage.action?pageId=3145730#Git&GitHub-Git編
とか
commitしてpushしたところ
remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: error: is denied, because it will make the index and work tree inconsistent remote: error: with what you pushed, and will require 'git reset --hard' to match remote: error: the work tree to HEAD. remote: error: remote: error: You can set 'receive.denyCurrentBranch' configuration variable to remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into remote: error: its current branch; however, this is not recommended unless you remote: error: arranged to update its work tree to match what you pushed in some remote: error: other way. remote: error: remote: error: To squelch this message and still keep the default behaviour, set remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
というエラーが出たため、調べたところ下記が参考になりました。
http://d.hatena.ne.jp/shokai/20101105/1288968082
”git config --add receive.denyCurrentBranch ignore”をDropbox側のリポジトリで実行したところ、pushが通るようになりました。