c++

new と malloc(3) を混在させていいのか

という議論が ここ にあったけど(2007 年……古い……!),malloc(3) で取ってきたメモリを delete(もしくは delete[])に渡してはいけないとか,new で取ってきた メモリを free(3) に渡してはいけないのに malloc(3) を読んだり new したり しても問題ないってのはなんか奇妙な話な気がしてきた。 (普通に C++ 書いていれば malloc には用がないけど)。 なぜかというと,どちらのメモリも malloc(3) が管理していないと, 同じ領域が別の用途で使われてしまうということになるので。 で,new で取ってきたのも malloc が管理しているんだったら, delete しても free(3) に渡されるだけだから, デストラクタとかがなければ問題にならない気がする。 と思って gdb でアタッチして試し

チャンクアップデートの最初幅を使ってパフォーマンスチューニングした

Minecraft で読み込まれるチャンクの半径は 3–16 の間で選べるのだそうだ。 ということは,5 チャンク飛ばして更新されているか確認していけば 3 チャンクだったとしても どこかのチャンクにはぶつかるということだ。 というわけで,1 チャンク見て,間の 5 チャンクは更新されているかの確認もせずに 飛ばして,更新されていたら間のチャンクがアップデートされているか確認する ということにすると,何も更新がない場合の生成がかなり速くなった。 やっぱりやることを減らすと簡単にかなり速くなる。

Minecraft のマップを生成するやつを C++ で書き直し始めた

一月は行く,二月は逃げる,三月は去るみたいな,この時期にありがちな,でもちょっと早いような話をしつつ……。 でももう二月なんで早いですよね。まあそんなことはどうでもいい。 こないだ作った Minecraft のマップ画像を生成するやつを C++ で書き直し始めてみたりした。 でもまあ今日はそんなに作業できなかったのでほとんどヘッダファイル書いたら終わったみたいな感じだけど。 もともと Python で書いていたやつは anvil-parser というライブラリを使っていて, そのライブラリは NBT なる Minecraft の独自バイナリ形式のパーズには nbt という別のライブラリに 任せているっぽかった。nbt というライブラリのリポジトリを見に行ってみたら,チャンク読むところとかも実装されていて, なん

C言語使っていると「すげえ」ってなるC++の機能

今まで C 言語ばっかり使ってきて、C++ を使ったときに驚いた機能です。 比較的新しい言語仕様もあるっぽいので、処理系によってはサポートしていないかもしれません。 auto auto キーワードを使うと型推論してくれます。 例えば、 #include <iostream> auto plus(auto a, auto b) { return a + b; } int main() { std::cout << plus(1.2, 3.4) << std::endl; return 0; } こういうのが $ ./a.out 4.6 コンパイルも通ってちゃんと動きます。 で、こういう auto を float と宣言すればいいだけ、みたいなやつだけじゃなく、 以下のような変なやつも #include <iostream>#include <complex> auto plus(auto a, auto b) { return a + b; } int main() { std::cout << plus(1.2, 3.4) << std::endl; std::cout << plus(std::complex<int>(1, 3), std::complex<int>(5, 7)) << std::endl; return 0; } $ ./a.out 4.6 (6,10) ちゃんとコンパイルが通って動きます。怖い怖い!! (大袈裟) ラムダ式 C 言語ではある処理単位を引数として渡したい場合、 グローバルに

C++標準ライブラリのマニュアルページをインストール

Ubuntu (をはじめ多くの GNU/Linux ディストリビューション) では C 言語のマニュアルページは最初から標準で入っていますが、 C++ のマニュアルページは入っていません (C++ にはマニュアルページを見る文化がないのだろうか…)。 という訳で、自分でインストールする必要があります。 $ sudo apt install libstdc++-8-doc で、見るときは、 $ man std::vector みたいな感じで std:: までつけないといけないみたいです。