タグ

C++11に関するfa11enprinceのブックマーク (15)

  • https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md

    https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md
  • C++11のスレッド、アフィニティ、ハイパースレッディング | POSTD

    背景と導入 何十年もの間、CやC++の標準規格は、マルチスレッディングや並行処理を「その標準の範囲を超えたもの」として扱ってきました。標準規格の目的である”抽象機械”の力が及ばない、”対象依存”という影の世界においてです。メーリングリストやニュースグループの質問には並行処理に関するものが山ほど寄せられましたが、それらにすぐに突き返された回答は「C++はスレッドには関知しません」という何とも冷淡なものでした。この件によって当時のことを思い出す人々は、今後も絶えないでしょう。 しかしC++11の登場で、そんな状況に終止符が打たれたのです。C++標準化委員会は、時代の流れに乗らないと、この先C言語が取り残されてしまうと悟ったのでしょう。彼らはスレッドや同期メカニズム、アトミック操作、メモリモデルなどの存在に、ようやく気付いたわけです。そして標準規格として、C++コンパイラやライブラリのベンダーに

    C++11のスレッド、アフィニティ、ハイパースレッディング | POSTD
  • const rvalue をムーブ元にする - 主題のない日記

    C++11 で追加された機能の内で重要なもののひとつがムーブセマンティクスだ。 言語のコアに追加されたのは参照の区別であり、それがあると値を複製せずに移動 (所有権の移動) だけで済ませてしまえる場合があるので性能的に有利というものである。 さて、所有権を移動させるということは移動元を破壊してしまう。 関数の返却値を const にすると破壊するわけにいかず、ムーブが機能しない。 故に関数の返却値は基的に const は付けない方がよいとする意見を見た。 つまり'+', '-', '*', '/'の演算子のオーバーロードですが、C++11ではconst返ししないほうがいいということでした。 理由はconstを付けてしまうとムーブセマンティクスが働かないからです。 http://fa11enprince.hatenablog.com/entry/2014/11/25/004307 しかし、

    const rvalue をムーブ元にする - 主題のない日記
  • find関数で見るC++の変化 - C++と色々

    STLアルゴリズムはそのアルゴリズムを適用する範囲の先頭と末尾のイテレータのペアを引数に取ります。実際には範囲全体にアルゴリズムを適用させるケースが多く、イテレータのペアを書くのが冗長に感じることがあります。そこでBoost.Rangeには、範囲を引数に渡すことでその範囲全体にSTLアルゴリズムを適用する関数たちがあります。Boost.Rangeのfind関数の実装例を見てC++03/C++11/C++14の比較をしたいと思います。 C++03 まず、範囲なら何でも、コンテナでも組み込み配列でもアルゴリズムに適用できるように、begin関数、end関数を定義します。 namespace ns { //コンテナ版begin/end関数 //非const、constでオーバーロード template <typename Container> typename Container::iterat

    find関数で見るC++の変化 - C++と色々
  • C++11のラムダ関数の簡単なまとめ - minus9d's diary

    C++11で導入されたラムダ関数を使えるようになるための簡単な覚書です。 ラムダ関数とは? 名前のない関数のことです。無名関数と呼ばれることもあります。 わざわざ関数を定義するほどのこともない、ちょっとした処理を行いたいときに使われることが多いです。あまりラムダ関数で複雑な処理をするとコードが読みにくくなるので注意。(関数に名前がついていないので処理の内容を予想できなくなるため) 最初の例 まず最初に、「整数を一つとり、その二乗を返すラムダ関数」から。このラムダ関数は以下のように書けます。 auto f1 = [](int x) { return x * x; }; このラムダ関数を呼び出してみます。 // ラムダ関数を呼び出す。関数ポインタみたいに使える std::cout << "1: " << f1(1) << std::endl; std::cout << "3: " << f1(

    C++11のラムダ関数の簡単なまとめ - minus9d's diary
    fa11enprince
    fa11enprince 2015/03/09
    とてもわかりやすいラムダ式まとめ
  • C++11時代におけるクラスの書き方 - イグトランスの頭の中

    記事は、C++11 Advent Calendar 2011 : ATNDの2日目の記事です。 C++のclassは様々な使い方ができます。後発のほかの言語ではいくつもの概念に分かれているものも、C++ではすべてclassということもあります。 そこで、C++でclassを定義する際も、classと一括りにせず、自分がいったいどんなclassを書こうとしているのか明確に意識するとよいのではないだろうかと考えました。そのために、私なりのclassの分類をまとめ、この記事を書くことにしました。 これは、各々のプログラミング言語の経験により違いが出ることと思います。異論もあると思いますので、ご自身でも考えてみるとよいと思います。 以下、この記事では4種類に分類しています。 1つ目は「オブジェクト指向プログラミング (OOP) を実現するクラス」です(長いので以下OOPクラスと略します)。 vi

    C++11時代におけるクラスの書き方 - イグトランスの頭の中
  • C++11メモ @ std::initializer_listでコンテナクラスの初期化が便利に - ラーメンは味噌汁

    2013-09-12 C++11メモ @ std::initializer_listでコンテナクラスの初期化が便利に C++11 std::initializer_listとは C++11では配列や構造体の初期化で使用していた中括弧"{}"をstd::initializer_listとしてコンパイルされるようになりました。std::initializer_listは読み取り専用のコンテナクラスです。これをコンストラクタで受け取ることで配列の初期化と同じ用にコンテナクラスを初期化できます。また、関数の引数としても受け取ることで要素の追加なども簡単に書けます。 例)std::vector 初期値を0,1,2とし、後から10, 20,30を追加 // 旧 std::vector<int> intVec; intVec.push_back(0); intVec.push_back(1); intV

    C++11メモ @ std::initializer_listでコンテナクラスの初期化が便利に - ラーメンは味噌汁
    fa11enprince
    fa11enprince 2015/02/26
    make_pairを使わなくて初期化できる
  • C++11メモ @ 生配列よりstd::arrayを使う - ラーメンは味噌汁

    2013-09-17 C++11メモ @ 生配列よりstd::arrayを使う C++11 std::arrayとは std::vectorの登場で生配列を使用する機会が減りましたが、固定長の配列を使う機会はまだあります。とはいえstd::vectorに比べて生配列は機能が少なく使い難いものです。std::arrayは生配列をラップしてstd::vectorのように使えるようにしてくれます。単純にラップしただけなので速度やメモリのコストは生配列と変わらないので気にせず使っていけます。 使い方 型と要素数を指定して宣言します。 std::array<型, 要素数> 生配列と同じように初期化できアクセスも同じように可能です。 // 配列と同じ用に初期化 std::array<int, 3> intArray = { 0, 1, 2 }; // 普通の配列と同じ用に使える intArray[0]

    C++11メモ @ 生配列よりstd::arrayを使う - ラーメンは味噌汁
  • 本当は怖くないムーブセマンティクス - yohhoyの日記(別館)

    この記事は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

    本当は怖くないムーブセマンティクス - yohhoyの日記(別館)
    fa11enprince
    fa11enprince 2014/10/17
    アンチパターンが書いてあるのがうれしい記事
  • シンプルな配列クラスを使って「右辺値参照」と「ムーブセマンティクス」を知る - Qiita

    C++11 の新しい機能に「右辺値参照」と「ムーブセマンティクス」があります。 ググればこれらに関して解説されてるサイトが結構ありますが、一般的には理解しづらいものとして扱われてるみたいです。 かくいう自分もよくわかりませんでした……。 ですので、今回は至ってシンプルな配列クラスを使って、これらが何を意味するのかを知ろうかと思います。 従来は「コピー」 まずは、「右辺値参照」と「ムーブセマンティクス」を使わないコードを見てみます。 #include <iostream> using namespace std; struct Array { typedef int ValueType; ValueType *p; int length; // コンストラクタ Array(int _length) : p(new ValueType[_length]) , length(_length) {

    シンプルな配列クラスを使って「右辺値参照」と「ムーブセマンティクス」を知る - Qiita
    fa11enprince
    fa11enprince 2014/10/16
    右辺値参照
  • STL入門 第1回 ~algorithm編~ - Gobble up pudding

    2020-10-13 C++使うなら最低限STLくらいは知らないといけないだろうということで勉強中です。 STLくらいっていうけど結構ここから険しい道の入口なんですけどね…。 他の言語に比べて気持ち悪いシンタックスが増えるし、 どういうわけか覚えにくい……なんでだろ。 そんなわけでSTLのアルゴリズムの入門編です。 関数オブジェクトです。コールバック関数のように使えて、 アルゴリズムに渡します。 アルゴリズムにはtransformとかcount_ifとかremove_ifとかequalとかいろいろあります。 関数オブジェクトの定義はoperator()が定義(オーバーロード)されているオブジェクトのことです。 今回は1つの引数を受け取る単項関数オブジェクトのかわりにラムダを突っ込みます C++11以前は単項関数オブジェクトを作るのに、 unary_functionというものを継承するという

    STL入門 第1回 ~algorithm編~ - Gobble up pudding
    fa11enprince
    fa11enprince 2014/10/04
    初めてC++でラムダ式使った(*´Д`)いい感じ
  • C++11 - Wikipedia

    この記事は更新が必要とされています。 この記事には古い情報が掲載されています。編集の際に新しい情報を記事に反映させてください。反映後、このタグは除去してください。(2019年1月) C++11は、プログラミング言語 C++ のISO標準 ISO/IEC 14882:2011 の略称である。規格の策定中は2009年中の標準化を目指していたため、C++0x という仮称で呼ばれていた。 ISO/IEC 14882:2003 (C++03) に代わるものとして、2011年8月12日にISOによって承認された[4]。後継のC++14が2014年8月18日に承認されている。 コア言語への機能追加や標準C++ライブラリの拡張を施し、C++TR1ライブラリの大部分を(数学的特殊関数ライブラリを除いて)取り込んでいる。 標準策定の方針[編集] C++ への修正はコア言語と標準ライブラリの双方に及ぶ。 委員会

    fa11enprince
    fa11enprince 2014/09/29
    よくまとめられていてわかりやすい!
  • rvalue reference、move semanticsに挫折した人のための再入門解説 - Ideals and Reality

    この記事は C++11 Advent Calendar 14日目の記事です。 何がわかりにくいのか C++11から正式に導入される新機能である、move semanticsとrvalue referenceですが、なかなかこれを理解出来ないという人が多いようです。 ちょっと考えればなるほど、と思いますが私が思うにこのわかりにくい最大要因はやはりその名前のせいかと思います。 特にrvalue referenceですが、日語に訳すと右辺値参照という呼ばれ方をしています。 そもそも右辺値や左辺値という名称はC言語時代の流れでそのまま引き継いでいるものであり、右辺値参照という名称は言わば後付けで名称されたものです。 実際に使用する際に右辺値なのか左辺値なのかを意識している人は殆どおらず、これが余計な混乱を招いているのではないかと思います。 ではコードを書いてみて理解しましょう。 lvalueとr

    rvalue reference、move semanticsに挫折した人のための再入門解説 - Ideals and Reality
  • constexprとrvalue参照問題 - とくにあぶなくないRiSKのブログ

    constexprとメンバ関数の呼び分け問題 小ネタ - constexpr の文脈でconstメンバ関数と非constメンバ関数を呼び分ける - ボレロ村上 - ENiyGmaA Code このエントリで指摘されているように、constexprとメンバ関数の呼び分け問題があります。一時オブジェクトはconst修飾されていないために、constexprであるconst修飾メンバ関数が呼ばれないのが原因です。 template<typename T> struct X { T t; T& get() { /* 非const版 */ return t; } constexpr T const& get() const { /* const版 */ return t; } }; template<typename T> constexpr auto get(T&& t) -> decltype(

    constexprとrvalue参照問題 - とくにあぶなくないRiSKのブログ
    fa11enprince
    fa11enprince 2014/07/28
    ほげげ
  • C++11 乱数 std::random 入門

    rand() の問題点 これまで広く使用されてきた rand() による乱数生成には以下の問題点がある。 生成される範囲が [0, 32767] と狭い rand() % N は一様では無い 周期があまり長くない 乱数生成アルゴリズムが固定(通常は線形合同法) 正規分布など、一様でない乱数生成が面倒 rand() で生成される値の範囲は [0, 32767] と狭い。15ビットしかない。 (rand() << 15) + rand() とすれば、30ビット乱数にすることは可能だが、スマートではないし、 生成アルゴリズムの関係で、乱数に偏りが出る場合がある。 通常、乱数として欲しいのは [0, N) 範囲の値であることが多い。この場合は rand() % N とすることが一般的だ。 しかし、このようにして生成した乱数は一様でなく偏りがある。特に N が大きい時にその現象が顕著になる。 例えば

    fa11enprince
    fa11enprince 2014/06/07
    この解説なら使い方がわかる(´;Д;`)
  • 1