年末のヒマつぶしに C++ 界の過激派である Alexandrescu のページを見ていたら, "volatile - Multithreaded Programmer's Best Friend" という記事があった. 2003 年に書かれ, "もっと volatile を使おうぜ" と主張するこの記事は, おおざっぱにいうと Java の "synchronized" と似たかんじで volatile を使う方法を提案している. 以下受け売り. const はメモリへの書込みを制限し, volatile はメモリアクセスの最適化を制限する. このように役割は違う const と volatile だが, 似たところがある. 実際 C++ の仕様でも "cv-qualifier" と一括りで扱い, 文法上は同じように振る舞う. たとえばこんなコードを考える. struct object_
> 基底クラスの段階でのprivateと継承してからの段階でprivate > 扱いになるのとでは意味が違うのでしょうか? 継承時のアクセス制限は、いうなれば「継承する側の都合」なので、 「継承する自分自身を"呼ぶクラス"や自分自身より"下位の派生クラス"」に影響します。 privateで継承したクラス自身はこの影響を受けずに、 自分自身は基底クラスの方の影響だけを受けるということです。 定義も派生する側に書きますよね。 同じ基底クラスからでも継承するクラス毎に別設定できるということです。 # なので、他のクラスの一部実装だけを流用するためにprivateで実装継承なんてこともありえるのです。 # publicで継承すると余計なインターフェイスまで取り込んじゃいますが、 # privateなら内部で利用するだけですから余分なものがあっても自分が使うだけで、外には漏らしません。 # (pri
2005-09-21 関数の引数の正当性は、可能な限り確認した方が、信頼性の高いプログラムになることはいうまでもありません。しかし、引数の確認に伴うオーバーヘッドも馬鹿にならないため、デバッグ時のみ確認を行うようにし、最終出荷時には確認を省略することがよくあります。そんなときに役立つのがおなじみのassertマクロ*1です。 さて、Cの場合には、引数といえば関数ぐらいしかない(厳密には関数形式マクロもある)わけですが、C++には、もうひとつ重要な引数を持つ言語機能があります。それはテンプレートです。関数の引数の正当性を確認すべきであるとするなら、当然、テンプレート引数の正当性も確認すべきです。 ところが、テンプレート引数はコンパイル時に作用するものですから、assertマクロで実行時に確認するのは純粋なオーバーヘッドになってしまいます。何とかコンパイル時に確認する方法があれば、実行時には全
トップ C言語TIPS集 個別のプログラム([編集][全て選択]→[編集][コピー]、C言語ファイルとして[貼り付け]) C言語/C++言語で2次元配列を動的に確保&解放するプログラム C言語/C++言語で3次元配列を動的に確保&解放するプログラム C言語/C++言語で OleLoadPicture を使って画像を表示する C言語/C++言語でプログラムのメモリ使用量を得る yが偶数のときrが0になり、yが奇数のときにrが定数Aになる式 乱数 Xorshift のSSE2を使った高速化(整数版) 乱数 Xorshift のSSE2を使った高速化(浮動小数点数版) 乱数 Xorshift のSSE2を使わない高速化 Ubuntu 8.04 GTK+ でウィジェットのフォントを変更する例(和文等幅フォント) Ubuntu14.04+Wineでウィンドウの位置が下にずれるのを防ぐ エクセルVBA
複数の(異なるかも知れない)型のオブジェクトが単一の関数から返される場合を想定する. template< class T, class U > typename cradle::common_result< T const &, U const & >::type f( T const &t, U const &u, bool b ) { if( b ){ return t; } return u; }このとき,上のコード片におけるメタ関数 cradle::common_result の設計と実装を行いたい,という問題. まず,標準の規格 ISO/IEC-14882:2003 にある記述で問題領域をほぼ共有するものがあるのでそれを参考にする.(3項)条件演算子の戻り値の型に関する記述 (5.16/3), (5.16/4), (5.16/5), (5.16/6) がそれ.ちゃんとこれを説明す
Programming languages --- C++ Languages de programmation --- C++ ISO/IEC JTC 1 Secretariat: ANSI Voting begins on: 1998-04-23 Voting terminates on: 1998-06-23 In accordance with the provisions of Council Resolution 21/1986, this document is circulated in the English language only. PRODUCTION NOTE: The dates in the headers of this FDIS, which currently read "1997", will be changed to "1998" bef
[ Home on 246net ] C++で開発 好むと好まざるとに関わらず、C++言語を使った開発をすることになったときに調べたことの蓄積。 言語仕様 ブートストラップ main関数 main関数について パッケージ管理 名前空間 名前空間の使用 ヘッダファイル ヘッダファイルとは インクルードガード ヘッダファイルの依存性をなくすには 文法要素 プリプロセッサ 条件コンパイル 可変引数を取る関数(stdargs他) 定義済みマクロ 型 組み込み型 標準定義型(標準typedef等) ビットサイズ固定整数型、 typedefの注意 クラス コンストラクタ メンバー変数 演算子関数 ビットフィールド 継承 例外 標準例外 例外処理のプログラミング テンプレート メンバ関数の特殊化 デバッグ アサーション ANSI Cのassert VC++固有のassert コーディング標準 公知のコー
1985年、AT&TのBjarne StroustrupがC++をこの世に送り出しました。その後C++は様々な拡張を繰り返しながら進化してきました。 1991年、ISOはC++の国際標準(standard C++)を定める作業を開始しました。標準C++の最終草案は1997年にISO C++標準化委員会に承認されました。 標準C++が規定するのは言語仕様だけなく、C++標準ライブラリも規格の中で明確に定められています。それまでC++のライブラリといえばiostreamぐらいのものでしたし、それもあくまで"事実上の標準"でしかありませんでした。 そしてそのC++標準ライブラリの一部として組み入れられたのがSTL(Standard Template Library)です。すなわちSTLは標準C++の仕様の一部ということです。 僕がSTLを知ったのは1995年、いくつかのコンパイラがtemplat
このドメインは お名前.com から取得されました。 お名前.com は GMOインターネットグループ(株) が運営する国内シェアNo.1のドメイン登録サービスです。 ※表示価格は、全て税込です。 ※サービス品質維持のため、一時的に対象となる料金へ一定割合の「サービス維持調整費」を加算させていただきます。
VC++ / MFC 覚書 去年(2000年)あたりから、仕事の上で、どうしても Windows プログラミングを せざるをえなくなってしまった。やり始めてみると、 意外に面白いということが分かったのだが、いかんせん、 Windows プログラミングの頻度はそれほど高くない。 しばらくすると、やり方をすっかり忘れてしまったりする。 そこで、備忘録として、MSDN ライブラリや書籍類から得た情報を、 少しずつまとめていこうと思う。 VC++ 定義済みマクロ (2001-03-13) プリコンパイル済みヘッダー (2001-12-13) VC++ の困った癖 (2001-12-13) ドキュメント型 (2001-03-14) VC++ マクロシンボル MSDN ライブラリでは、「組み込みマクロ」、 「/U、/u (定義済みマクロ シンボルの無効化)」あるいは、 「Using the SDK H
VC6 の関数テンプレートのバグにハマる またしても VC++ 6 のワナにハメられてしまった。 今回は、次のような関数テンプレートを定義し、 template<int N> void foo() { cout 次のような呼び出しを行った。 foo<1>(); foo<2>(); 当然、"1" と "2" が表示されることを期待したわけだが、結果は何と両方とも "2"。 どうやら VC6 では、 テンプレート引数だけを変えて関数テンプレートのインスタンスを複数作ることができないらしい。 こんな中途半端なことをされるくらいなら、いっそコンパイルエラーになって欲しかった。 そのほうがすぐに別のやり方に書き直せるし、不可解なバグに悩まずにすむ。 ちなみに、上の問題を回避するには、ファンクタ (関数オブジェクト) を使うのが常套手段。 template<int N> class Func
以下のコードのように、コピー(Move)するauto_ptrのelement_typeが異なるとoperator auto_ptr_ref<_Other>()が無限に再帰してスタックがとぶ どうもauto_ptr_refのコピーコンストラクタを呼ぶために再びこれが呼ばれるようだ コンパイラのバグではなくSTLのバグと思われる VC8付属のものは直っている []#include[] []<memory>[] []// auto_ptr[] []std[][]::[][]auto_ptr[][]<[][]int[][]> [][]new_int[][]()[] []{[] []return[] []std[][]::[][]auto_ptr[][]<[][]int[][]>([][]new[] []int[][]());[] []}[] []void[] []test[][]()[] []{[
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く