概要 alignof()は、指定した型がメモリ上のどの位置に配置されるか(アライメント)取得する演算子である。「アライン オブ (align of)」と読む。 sizeof()と異なりalignof() は変数には使用できない。 例えば型intが4バイト境界の位置にアライメントされるシステムであれば、alignof(int)は4を返す。 仕様 alignof(型)は、指定した型のアライメントのサイズを返す。戻り値の型はstd::size_tである。 もっとも制約の弱い、すなわちアライメントのサイズが最小となる型はchar, signed char, unsigned charであり、 もっとも制約の強い、すなわちアライメントのサイズが最大となる型はstd::max_align_tである。 例 #include <cstddef> #include <iostream> struct hog
理想 ビルド不要でヘッダ1つ 標準ライブラリのみに依存していてポータブル ヘルプを自動生成してくれる オプション定義時に格納先の変数を紐付けできる (argc, argv) だけでなく std::string とかからも読み込める 読み込める形式で全ての値を書き出せる マクロではなくtemplateやlambdaなど真っ当なC++ (できればC++11以降の簡潔なスタイル) で書ける GNU getopt https://www.gnu.org/s/libc/manual/html_node/Getopt.html UNIX的な環境ならインストール不要だがC/C++標準ではない ヘルプなど自動生成してくれない C++というよりCなので手作業が多い boost::program_options https://www.boost.org/doc/html/program_options.ht
mapコンテナ(mとする)でキーの有無を調べる場合、今まではメンバ関数のm.find()を呼ぶ方法を使っていた。m.find()を使う方法では、「m.find()の戻り値がm.end()に等しければキーが存在しない、そうでなければキーが存在する」としてキーの有無を判別していた。 しかし、m.count()を使った方がより直感的である。m.count()を使う方法では、「m.count()の戻り値が0に等しければキーが存在しない、1に等しければキーが存在する」という簡単仕様なので分かりやすい。 以下のコードでは、find()を使う場合とcount()を使う場合とを比較した。どちらも結果は同じである。 #include <iostream> #include <map> using namespace std; bool has_key_using_find(map<int, string>
この記事の内容 オブジェクト指向と10年戦ってわかったこと Twitterやはてブコメントを見たら、「わかりやすかった」というコメントもあったのですが、どちらかというとネガティブ方面なコメントが多く目につきました。マサカリという用語で忌憚なく意見を言う風潮については別にいいんですが、「わかりにくい」「間違っている」「古い」みたいなコメントは何も生み出さないし、みんなでニコニコポエムを投稿しあうやさしいインターネッツになったらいいなって思ったので、僕もオブジェクト指向について投稿しようと思います。 何原則? 3原則じゃなくて4では?みたいなコメントもあったのですが、別に3でも4でも5でも重要ではないかなって思います。この4原則の出どころがどこかは知らないですが、C++かSmalltalkあたり(このあたりの話を見かけたのはJava登場前だった気がする)をターゲットとしている気がします。Jav
※デザパタのAbstractFactoryと紛らわしいけど違うっぽい...でもGoFのアレは「パターン」と呼べるのか? ...ともかく、抽象クラスのファクトリメソッドを呼んだら適切な具象クラスのインスタンスがnewされて返ってきたら便利だと思わないか? だが親クラスは子クラスの実装は知らないのが原則(解放/閉鎖)なので普通にC++だけで組むと子クラスのファクトリメソッドを呼べなくて実装不可能...だと思ってたんだけど、ふと思いついてそれを可能にするテンプレートクラスを作ってみた。 template<typename T> class FACTORY{ FACTORY(); FACTORY(const FACTORY&); void operator=(const FACTORY&); public: FACTORY(T* (*f)()) : next(start), factory(f){
Memcheck is a memory error detector. It can detect the following problems that are common in C and C++ programs. Accessing memory you shouldn't, e.g. overrunning and underrunning heap blocks, overrunning the top of the stack, and accessing memory after it has been freed. Using undefined values, i.e. values that have not been initialised, or that have been derived from other undefined values. Incor
まぁ、不慮の例外といいますか、突然飛んでくる例外というのはいろいろあるわけで。 そりゃ、例外なんて名前がついているから、例外的に突然飛んでくるのは当たり前だろうとこともありますね。 では、この例外をだれが投げたかを C++ で追跡することはできるのでしょうか。 _ □□ _ ___、、、 //_ [][]// ,,-―''':::::::::::::::ヽヾヽ':::::/、 誰 投 こ // \\ // /::::::::::::::::::::::::::::::i l | l i:::::::ミ だ げ の  ̄  ̄  ̄/ /:::::::::,,,-‐,/i/`''' ̄ ̄ ̄ `i::;| あ た 例 ―`―--^--、__ /:::::::::=ソ / ヽ、 / ,,|/ っ の 外 /f ),f
Pythonを使った頃はバックトレース機能がとても強いためエラーの追跡に悩んだことはあまりありませんでした。 >>> def hogehoge(): print traceback.print_stack() ... >>> def hoge(): hogehoge() ... >>> hoge() File "<stdin>", line 1, in <module> File "<stdin>", line 1, in hoge File "<stdin>", line 1, in hogehoge None しかしC++ではそんな便利なことはなかなかできません。 自分が模索してきたエラーの追跡と特定手法をここに書いておきます。 デバッグツールとMSVCを使ってる人には向けません。 スタックトレース コールツリーを調べるときに使えます。 以下のコードは Windows 7 mingw-
■ [c++] C++でバックトレースを表示する bkブログの 普通のやつらの下を行け: C でバックトレース表示 C++ のシンボルをデマングルする で全て語られているけれど、自分で使ってみたのでメモ。環境はUbuntu 10.04。 バックトレースはThe GNU C Libraryにあるbacktrace()とbacktrace_symbols()を使って取得できる。マニュアルはここ。 C++の場合、backtrace_symbols()で得られる関数名がマングルされていて読みづらい。The GNU C++ Libraryにあるabi::__cxa_demangle()を使うと元の関数名を取得できる。マニュアルはここ。 サンプルプログラムと実行結果をメモ。backtrace_symbols()のマニュアルにもあるけれど、関数名を得るにはリンカオプションとして -rdynamic を指
私はC++歴3年の学生趣味プログラマーです。 「C++はなぜヘッダと実装を分けなくてはならないのか/そもそも本当に分けなければならないのか」という質問です。 C++といえば、ヘッダー部と実装部を.hファイルと.cppファイルに分けることが一般的とされている言語ですが、 これは同じオブジェクト指向言語のC#やJavaにはない特徴です。 そのせいでC++使いたちは今日もcppファイルとhファイルを行ったり来たりしながらコーディングする羽目になっています。(そしてVS使いはF12とCtrl+-を得意気に連打しています。) 私にとってもそれが当たり前になって久しいですが、 時々C++を学び始めたばかりの後輩から「なぜヘッダファイルに実装を書いてはならないのか」「なぜC++は二度も同じコードを書くことを強いるのか」と質問を受けます。 私はそのたびに「実装の隠蔽化」とか「循環参照の危険が云々」とか「そ
以前の記事にもLinuxでのメモリーリークの検出に関する事を書いたのですが、もう少し一般的なやり方を紹介しましょう(というより、自分で毎回忘れるので備忘録として・・・)。 【mtraceを使う方法】 まず、mtraceを使う方法です。リークのテストを開始したい場所でmtrace()をコールし、終了したい場所でmuntrace()をコールするようにします。 #include <stdio.h> #include <stdlib.h> char *test() { char *test=malloc(10); return(test); } int main() { char *ptr; mtrace(); ptr=test(); //*(ptr+10)='\0'; //free(ptr); muntrace(); return(0); } -gつきでコ
When you use the Microsoft C++ compiler (MSVC) to create applications to run on a 64-bit Windows operating system, you should be aware of the following issues: An int and a long are 32-bit values on 64-bit Windows operating systems. For programs that you plan to compile for 64-bit platforms, you should be careful not to assign pointers to 32-bit variables. Pointers are 64-bit on 64-bit platforms,
後置インクリメントにはひと目で遅くなりそうな処理が見て取れますね。 前置インクリメントがインクリメント処理後、単純に自身の参照を返すのに対し、後置インクリメントではインクリメント前に一時オブジェクトの生成、そしてインクリメント後にはその前に生成した一時オブジェクトを値で返しています。 前置と後置では、単純にオブジェクトをコピーして返す分、普通に考えたら後置の方が遅いよね。というのが従来の認識でした。 「C++ Coding Standards -101のルール、ガイドライン、ベストプラクティス」の中でも、特に後置インクリメントの必然性が無い時は迷わず前置インクリメントを使うことが推奨されてきました。 元の値を必要としないときは前置形式の演算子を使おう __C++ Coding Standards (p50) 新たな主張 「ゲームエンジン・アーキテクチャ第二版」の中の一節を紹介します。 しか
この記事はC++ Advent Calendar 2012の15日目にエントリしています。 内容はC++11「ムーブセマンティクス」の入門記事となっています。 もくじ ムーブセマンティクス再考 シンタックス vs. セマンティクス コピー vs. ムーブ ムーブのもつ2つの意味 C++11のムーブセマンティクス対応 auto_ptrからunique_ptrへ auto_ptrの暗い過去 unique_ptrへの移行 std::moveの役割 ムーブセマンティクスを使おう C++11標準ライブラリとムーブ ムーブ"後"の中身は? ムーブを利用して関数を書く (本文のみ約9500字) まえがき To move or not to move: that is the question. ― Bjarne Stroustrup, 2010(改)*1 プログラミング言語C++の新しい国際標準規格*2
C++ Advent Calendar 2012 2日目の記事…なんですが、書きたいことが2つあったので2部作にしてしまいましたてへぺろ(・ω<) と、いう事で本記事は前編になります。 後編はこちら。 Boost.TypeErasure 概要 constexpr ライブラリである Sprout の布教を簡単に。 動作環境 本記事内では下記の環境で動作テストを行なっています。 コンパイラ:gcc 4.7.2 Sprout :commit d57b6e2b182144b8896f116f2d1b495f3e53436a(2012/12/02/12:00) constexpr とは constexpr とは C++11 に追加されたキーワードで、constexpr を指定することでコンパイル時定数として扱われます。 例えばこんな感じで使うことが出来ます。 template<int N> stru
ダック・タイピング(英: duck typing)とは、Smalltalk、Perl、PHP、Python、Ruby、JavaScriptなどの動的型付けに対応したオブジェクト指向プログラミング言語に特徴的な、型付けのスタイル(作法)のひとつである。ダック・タイピングはポリモーフィズム(多態性)を実現する手段のひとつとして使われる[1]。 Pythonのリファレンスでは、ダック・タイピングは「あるオブジェクトが正しいインタフェースを持っているかどうかを決定するために、オブジェクトの型を見ることはしないプログラミングスタイルである」と説明されている。代わりに、オブジェクトが持つメソッドや属性(フィールドまたはプロパティ)が単純に呼ばれたり使われたりする。特定の型よりもインタフェースを重視することで、うまく設計されたコードは、ポリモーフィックな代入の許可による柔軟性を向上する[2]。 静的型付
参照したすべての特権が呼び出し側に割り当てられていないことを示します。 この機能により、たとえば、割り当てられている特権を正確に知らなくても、すべての特権を無効にできます。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く