C++

GCCにおけるalignasのエラー

Tatsuya Yatagawa
こんにちはtatsyです。 最近C++11/14の機能を多用している私ですが、C++0xからの新機能であるalignasについて、少し躓いた点があるので、使用法と注意点をまとめておきたいと思います。 C++におけるアラインメント C++でのアラインメントとは、データをメモリ上に置く際に、ある区切りのいい数字の倍数から始まる場所にデータを置いてくださいという意味の数字です。 例えばSIMDの拡張命令を使おう ...

C++11の非静的メンバ変数初期化

Tatsuya Yatagawa
こんにちは、tatsyです。 最近はすっかりC++11/14のすごさにやられています。 というわけで今回はC++11から追加されたクラスの非静的メンバ変数初期化について実験をしてみました。 非静的メンバ変数の初期化とは? C++以外の言語、例えばJavaなどをやったことがある人なら、次のようなコードになじみがあると思います。 // A.java public class A { public int val = 1; public A() { } void print() { System.out.println(this.val); } } 注目していただきたいのは3行目です。3行 ...

インスタンスを返す関数におけるmoveの注意点

Tatsuya Yatagawa
こんにちはtatsyです。 最近Effective Modern C++を読んでいたのですが、読んでいて気づいた、言われれば当たり前だけど、意外とやってしまうmoveの注意点についてご紹介したいと思います。 Effective Modern C++ (外部ページに飛びます) おそらく、moveの最もよく使われるであろう使用場面はfactoryメソッドなどにおいてインスタンスをreturnするときだと思います。 例えば、次のように何らかのサイズを引数に取る ...

swap技法とshrink_to_fitの違い

Tatsuya Yatagawa
こんにちはtatsyです。 最近リーダブルコードを読んでおりまして、この世の中にはvectorのswap技法と呼ばれるものがあることを知りました。 swap技法とは? swap技法というのは、vectorがreserve等で確保している内部的なメモリのサイズ(capacityで確認できる)を切り詰めるための方法です。 通常、reserveというのはメモリ容量を増やすことはあっても減らすことはありません。つ ...

C++11のmoveを使ってみる

Tatsuya Yatagawa
こんにちはtatsyです。 最近C++11ってすごいなぁと思う出来事が多々ありまして、そのうちの一つをブログに書いておこうと思います。 C++11で新しく追加された昨日の一つにmove semanticsというものがあります。 詳しい説明に入る前に次の単方向連結リストのコードを見てください。 struct ListNode { int val; ListNode* next; ListNode(int val_ = 0, ListNode* next_ = NULL) : val(val_) , next(next_) { } }; class List { private: ListNode* tail; public: ListNode* root; public: List(); List(const List& list); ~List(); List& operator=(const List& list); void add(int val); private: void deleteNode(ListNode* node); void copyNode(ListNode* dst, ListNode* src); }; 通常のコ ...

OpenCV 2系から3系への変更点

Tatsuya Yatagawa
OpenCVが2系になりIplImageという負の遺産がなくなって早数年、OpenCVがついにver.3になりましたね。 まだbeta版ですが、ver.3になり、よりC++っぽい書き方に近づきつつある気がします。 2系から3系への変更点を気づいたところから備忘録的にまとめておきます。 cv::imread cv::cvtColor cv::TermCriteria cv::VideoCapture::get cv::PCA その他の変更点 cv::imread 2系 cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_COLOR); 3系 cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR); 変更点 グローバルのenumだったCV_LOAD_IMAGE_XXX ...

templateでクラスの大きさを指定する方法

Tatsuya Yatagawa
C++でクラスを作るときにsizeofで帰ってくる大きさを自由に決められるようにしたいなぁと思ったのでやり方を調べてみました。 まず、普通のint型みたいなものの大きさを変更する方法からです。これには__declspec(align(#))装飾子を使います。 // sizeof(Int4) == 4 struct Int4 { int n; }; // sizeof(Int8) == 8 (Visual C++) __declspec(align(8)) struct Int8 { int n }; // sizeof(Int8) == 8 (g++) __attribute__((aligned(8))) struct Int8 { int n }; で、このalignサイズをtemplateで指定できないかな、と考えるわけ ...

言われれば当たり前だけど気付かないvectorのこと

Tatsuya Yatagawa
最近Half-Edge構造のプログラムを書いていて、vectorの性質で気をつけるべきことがあることに気付いたので備忘録的に記しておきます。 Half-Edge構造のことをしっている人ならなんとなくわかると思うのですが、あるオブジェクトに何らかの別のオブジェクトを指すポインタを持たせておきたい場合があると思います。 今は分かりやすくするためにオブジェクト1とオブジェクト2と呼ぶことにしましょう。 オブジ ...

sortとpriority_queueの並び変え順序

Tatsuya Yatagawa
こんにちは。 だいぶ昔から気になってはいたのですが、C++ STLではsortとpriority_queueで並び替えられる順序が違うのが気になっています。 sortもpriority_queueも並べ替え順序の初期値はstd::lessになっているはずなんですが、次のプログラムを実行すると、逆の並び順になります。 ソースコード #include <stdlib.h> #include <time.h> #include <queue> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> v; priority_queue<int> que; srand((unsigned long)time(NULL)); for(int i=0; i<10; i++) { int x = rand() % 100; v.push_back(x); que.push(x); } std::sort(v.begin(), v.end()); for(int ...

ポインタの参照渡し

Tatsuya Yatagawa
調べてみるとC++の入門書にも書いてあるような内容らしいのですが、ポインタにも参照渡しというものが存在するということを今日初めて知りました。 プログラミングの教科書などは関数にポインタを渡して、そのポインタが指すオブジェクトの要素を変更すると、関数の外で見てもやはりポインタが指すオブジェクトの要素が変更されている、という話がよく書かれています。これは当然といえば当然で、関数の中と外で差しているポイン ...