C++

Visual C++にて、CPUにAVX命令があるかどうかを実行中に知る方法

C++

表題のことは、__cpuid, __cpuidexにあるサンプルコードで実現できます。Visual Studio 2017で確認しました。 自分の初代Core i7では、下記のようにAVXに対応していないことがわかります。 GenuineIntel Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz 3DNOW not s…

g++によるhello world再訪

C++

g++でhello.cppから実行ファイルを生成するときに何が起こっているかを調べてまとめました。全体的に gcc Compilation Process and Steps of C Program in Linux を参考にしています。元記事はCファイルを対象にしていますが、本記事ではC++ファイルを対象と…

multiset, multimapを使うにはset, mapをinclude

C++

しょうもないネタですが他にもハマる人がいるかもしれないので記事にします。C++11から導入されたstd::multiset, std::multimapを使おうと以下のコードを書きました。 #include <multiset> #include <multimap> しかしg++で以下のエラーが出ます。 致命的エラー: multimap: No su</multimap></multiset>…

Travis CI にて、C++11のソースをgccとclangの両方でビルドする

githubのレポジトリと簡単に連携できる継続的インテグレーションサービスであるTravis CIを使って、C++11で書かれたソースコードをテストできるようにしました。想像以上に大変だったのでメモしておきます。 ソースコードとテストコードの準備 Travis CIで提…

cmathをincludeするとy0, y1などのグローバル変数が使えなくなる問題

C++

一見問題なさそうな以下のコード #include <cmath> int x1, y1; int main() { x1 = 10; y1 = 5; return 0; } を、例えばVisual C++ 2015でコンパイルしようとすると、以下のエラーが出て失敗します。 main.cpp(3): error C2365: 'y1': redefinition; previous defin</cmath>…

Modern C++でのクラスに関する私的メモ

C++

C++のクラスについて理解があやふやなので、調べたことを以下にまとめます。C++11以降をターゲットにしています。 特殊メンバ関数 (Special member functions) 以下に、メンバ変数を2つとメンバ関数を1つのみ持つ単純なクラスを含むサンプルを示します。 #in…

gdbでvectorなどの中身をprintする

C++

gdbでvectorなどSTLのコンテナの中身をprintしようとすると、例えば以下のようにうまく表示できません。 (gdb) p x1 $1 = {<std::_Vector_base<int, std::allocator<int> >> = { _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x8003b9e8, _M_finish = 0x8003b9fc, _M_end_of_storage …</no></no></__gnu_cxx::new_allocator<int></std::allocator<int></std::_vector_base<int,>

C++11で、std::tie()を使って複数の変数への代入を1行で行う

C++

スクリプト言語だと、複数の変数への代入を1行で行えることが多いです。以下はPythonの例。 a,b,c = 10, 7.7, "hello" print(a,b,c) これと同じことをC++11でも行うには、std::tie()を使います。 #include <iostream> #include <tuple> using namespace std; int main(){ int </tuple></iostream>…

lower_bound(), upper_bound()の練習帳

C++

事前準備 数列は昇順にソートされている必要があります。 #include <iostream> #include <algorithm> int main() { std::vector<int> nums{1,1,1,1,2,2,3,3,3,4,4,6,6,6}; std::sort(nums.begin(), nums.end()); .... } 要素の数を数える 「3より小さい要素数」「3以下の要素数」を数え</int></algorithm></iostream>…

C++11のラムダ関数の簡単なまとめ

C++

C++11で導入されたラムダ関数を使えるようになるための簡単な覚書です。 ラムダ関数とは? 名前のない関数のことです。無名関数と呼ばれることもあります。 わざわざ関数を定義するほどのこともない、ちょっとした処理を行いたいときに使われることが多いで…

C++で1文字の繰り返しからなる文字列を作る

C++

C++で"aaaaa"などのように単一文字の繰り返しからなる文字列を簡単に作るには、以下のようにstringクラスのコンストラクタを利用します。 #include <string> ... std::string(5, 'a') ... これは、「長さ5の文字列を作り、'a'で埋める」という意味になります。 例と</string>…

Visual Studioのコードスニペット機能を使って高速にコードを書く

常識かもしれないのですが、Visual Studioのコードスニペット機能にいまさら気が付きました。 例えばC++の場合、classと打鍵してからTabを押すと、自動的に以下のコードスニペットが挿入されます。 class MyClass { public: MyClass(); ~MyClass(); private:…

Visual Studioで、namespaceのブロック内をインデントしないようにする方法

従来のVisual Studioでは、namespaceで囲ったブロック内が強制的にインデントされました。しかし、Visual Studio 2013のUpdate 2から(?)、インデントしないように設定できるようになったようです。(参考:Option to stop indenting namespaces in C++ code …

C++のvalarrayという不遇なライブラリ

C++

きっかけが何だったか忘れましたが、C++にはvalarrayという数値計算用のライブラリがあることを知りました。numpyやMatlab/Octaveのように、array同士の足し算ができたりします。 #include <iostream> #include <valarray> using namespace std; int main(){ valarray<int> v1(10, 3);</int></valarray></iostream>…

SIMD命令を使って高速に計算する

C++

マルチコアを用いた画像処理 from Fukushima Norishige このスライドに出てくるSIMD命令を試したくなったので試してみました。 IntelのCPUでSIMD命令を使う場合、SSEという命令セットと、その後継であるAVXという命令セットのどちらかを使うことになると思い…

C/C++11で直角三角形の斜辺の長さを求める関数hypot()

C++

ピタゴラスの定理を使うと、直角三角形の直角を挟む二辺の長さから、斜辺の長さを計算できるのはおなじみでしょう。それを計算してくれる関数がmath.hまたはcmathで提供されているhypot()です。 以下はC++11の例です。 #include <iostream> #include <cmath> using namespace </cmath></iostream>…

C++11で数字→文字列はstd::to_string()、文字列→数字はstd::stoi()とかstd::stod()とか

C++

数字から文字列 スクリプト言語でよくある、数字を文字列に変換する関数がC++11でも提供されています。std::to_string(100)などと書くだけで数字が文字列に変換できます。 #include <iostream> #include <string> int main() { std::string str = "Holland, " + std::to_string</string></iostream>…

g++のレアなエラー「前のエラーにより混乱していますので、脱出します」

C++

人間味あふれるエラーに初遭遇したのでご報告します。現時点でGoogle検索すると792件。 エラーを起こす方法。Windows 7 + Cygwin + g++ 4.8.2にて、g++ -std-std=c++11というコマンドで以下のコードを実行。何重にもミスがあるひどいコードである。 #include <vector></vector>…

Visual StudioでDLLを作る&使うサンプル

DLLの作り方と、DLLを呼び出すプログラムのサンプルをgithubに上げました。Visual Studio 2013 Expressがあればビルドできます。 minus9d/DllSample 以下の書籍を全面的に参考にしました。 APIで学ぶWindows徹底理解 (日経BPパソコンベストムック) p102~p109…

Linuxのターミナルにて、アニメーションを表示する

C++

昨日の記事と似たような感じで、エスケープシーケンスを使ってアニメーションを表示することもできる。今回もLinux系のターミナルでないとうまくいかないはず。 アニメーションには、printf("\033%dA", 10)とするとカーソルが10行分上に上がることを利用する…

Linuxのターミナルにて、C言語の出力に色を付ける

Linuxのターミナルにて、C言語の出力に色を付ける方法。c - Making some text in printf appear in green and red - Stack Overflowより。Windowsだとうまくいかないはず。 #define RESET "\033[0m" #define BLACK "\033[30m" /* Black */ #define RED "\033…

Segmentation Faultの傾向と対策

C++

C/C++のコードを書いてよく遭遇するのがSegmentation Fault、通称セグフォ。その傾向と対策をまとめてみた。 傾向 セグフォがよく起こるのは以下のとき。 メモリ違反 見てはいけないメモリ領域を参照したときに起こる。コード例は以下。 #include <stdio.h> int main(</stdio.h>…

googletestに付属するサンプルを読み解く

C++

こないだの続き。こないだは、samplesフォルダにあるsample1_unittestをビルドして、単体テストできていることを確かめた。今回は、その他のsample2〜sample10を同様にビルドして、sample1〜sample6の中身を読み解いてみる。sample7〜sample10は、残念ながら…

googletestを使いこなす

C++

最近のC/C++のテスト環境で人気があるのはgoogletest (=Google C++ Testing Framework)だと思われる。今回はCygwinでgoogletestを使ってみる。Linuxでも同じだと思われる。 準備 gtest-X.X.X.zipをgoogletest - Google C++ Testing Framework - Google Proje…

gprofを使いこなす

C++

C/C++のコードの速度を改善するときに有効な方法は、処理時間を多く消費する関数を見極めて、その関数を改善することである。どの関数が(1)どれだけ処理時間を消費するか、(2)何度呼ばれているか、(3)どの関数を呼んでいる/どの関数に呼ばれているか、などを…

VC++でUnicode文字の出力を試みる→MessageBoxでの出力はできたけど標準出力の方法分からず

C++

前回の記事に引き続いて、VC++で日本語文字を扱う方法についてあれこれ調べている。調べれば調べるほど、開いてはいけない蓋を開いているような気がしてならない。 今回はUnicode文字をVC++で出力することを目指した。結論から言うと、MessageBoxを使ってポ…

C/C++での日本語文字列の扱い、どうすればよいか

C++

C/C++でどう日本語の文字列を扱えばよいのか、いまだによく分かっていない。頭を整理するために、自分が理解している範囲のことを一度まとめてみる。嘘を書いているかもしれない。また、環境はWindowsのみを想定している。 マルチバイト文字列とワイド文字列…

代替トークンを使ってC++っぽくないC++コードを書く

C++

C/C++には代替トークン(alternative tokens)なるものがあることを知った。まず下のコードを見てほしい。 %:include <iostream> using namespace std; int main() <% int array<:100:>; for (int i = 0; i < 100; ++i) <% array<:i:> = i; if ( i % 3 == 0 and (not i % 5 == 0)) <%</:i:></:100:></iostream>…

C++11のthreadで遊んでみる その3 - condition_variable編

C++

この記事は続き記事です。目次→C++11のthreadで遊んでみる - minus9dの日記 - 今回はC++11のcondition_variableを使ってみる。condition_variableは日本語ではそのまま条件変数と訳される。条件変数は、あるスレッドを待ち状態にして、ある条件が揃ったとき…

GCC 4.7.3でC++11のsleep_for()を呼ぶとコンパイルできない件

C++

Cygwin + GCC 4.7.3 な構成で、C++11のstd::thread::sleep_for()を使ってみようと以下のコードを書いた。 #include <thread> #include <chrono> int main() { std::this_thread::sleep_for(std::chrono::milliseconds(300)); return 0; } 以下のコマンド g++ -std=c++11 slee</chrono></thread>…