タグ

関連タグで絞り込む (1)

タグの絞り込みを解除

c++に関するrryuのブックマーク (13)

  • C++でうっかり無限ループを書くと鼻から悪魔が出てくる - Qiita

    C++で副作用のない無限ループを書くと未定義動作になります。 「未定義動作」というのは口に出すだけでC++プログラマーを震え上がらせる力を持った言葉です。「鼻から悪魔が出てくる」という言葉で説明されるように、未定義動作を含むコードを実行した結果は何も保証することができず、バグの発見やデバッグすら困難にさせます。未定義動作下においてはコンパイラの気分によってコード片が消え、trueとfalseが同時に成立し、タイムトラベルを引き起こします1。 そのためC++ではうっかり未定義動作が埋め込まれないよう注意が払われるのが普通です。 さて、以下のC++のコードは未定義動作を引き起こします。 下の例は実際にclang/LLVMで最適化を有効にしてコンパイルするとでたらめな値を返す関数ができました。 この話をしたところ、何人かに驚かれたり異論を受け取ったりしたので、この話題について少しまとめてみました

    C++でうっかり無限ループを書くと鼻から悪魔が出てくる - Qiita
    rryu
    rryu 2019/01/25
    終了しないループを終了する前提で最適化するので、本来存在しないはずの結果が現出することにより鼻から悪魔が出ると。
  • C++でアスタリスクをつけすぎると端末が落ちる - Qiita

    ならint *型へのポインタになります。 これ、int *****pといくらでも付けられるわけですが、いったいいくつまでつけられるんでしょうか。これってトリビアになりませんかね。 実際に調べてみた。 スクリプト こんな適当なスクリプトを書く。 n = 100 if ARGV.size > 0 n = ARGV[0].to_i end puts "#include <cstdio>" puts "int main(void){" puts "int #{"*"*n}a;" n.times do |i| puts "#{"*"*i}a = new (int#{"*"*(n-i-1)});" end puts <<EOS printf("%x\\n",a); } EOS

    C++でアスタリスクをつけすぎると端末が落ちる - Qiita
    rryu
    rryu 2018/02/25
    ポインタ型一つ分のメモリをヒープに確保するのを3000回やってるだけだと思うのになんでそれで落ちるんだろう。
  • C++の未定義の挙動で呼ばれないはずの関数が呼ばれる場合

    Krister Walfridsson’s blog: Why undefined behavior may call a never-called function 以下のようなコードをClangでコンパイルすると、 #include <cstdlib> typedef int (*Function)(); static Function Do; static int EraseAll() { return system("rm -rf /"); } void NeverCalled() { Do = EraseAll; } int main() { return Do(); } Clangは以下のような最適化されたコードを吐く。 main: movl $.L.str, %edi jmp system .L.str: .asciz "rm -rf /" これは以下のようなコードと同じだ。

    rryu
    rryu 2017/09/26
    だんだん鼻から悪魔の世界に近づいてきたな。
  • 非推奨だった bool 型に対するインクリメント演算子を削除 - cpprefjp C++日本語リファレンス

    概要 C++17ではbool型に対する前置および後置のoperator ++を削除する。 bool型に対する前置および後置のoperator ++とはC++98の時点で非推奨になっていた機能である。 具体的にどのような働きをするのかというと、以下のように値をtrueに書き換える機能をもつ。 #include <iostream> int main() { bool b = false; const bool b1 = ++b; std::cout << std::boolalpha << b1 << std::endl; // => true const bool b2 = ++b; std::cout << std::boolalpha << b2 << std::endl; // => true }

    rryu
    rryu 2017/07/24
    C++の仕様に入れてしまうくらいフラグをインクリメントするコードが多かったということなのだろうか……
  • constexpr ifの落とし穴

    会社の同僚から、以下のようなコードが動かない、ネット上をググると解決策らしきものが見つかるがそれもいまいち納得できない、という相談を受けた。 template < typename T > void f() { if constexpr ( std::is_same<T, int>{} ) { // Tがintのときのみ発動してほしい // 実際は常に発動する static_assert( false ) ; } } C++17にはconstexpr ifが追加された。これは条件付きコンパイルではない。条件付き実体化抑制だ。 constexpr ifは以下のように使う。 struct S { int value() { return 42 ; } } ; template < typename T > int to_int(T t) { int value{} ; if constexpr

    rryu
    rryu 2017/05/12
    static_assertは副作用があるから評価のタイミングが異なると困るのか。
  • Bjarne Stroustrupのプログラミング入門書の査読の感想

    C++の設計者ストラウストラップによるプログラミング入門書の最新版日語訳が、9月に @asciidwango から出版されます。 https://t.co/ssT9ubfXtT — アスキードワンゴ編集部 (@asciidwango) August 5, 2016 アスキードワンゴ編集部からBjarne StroustrupのProgramming -- Principles and Practice Using C++というの第二版の邦訳が出版される。初版は翔泳社が出していたが、C++14に対応した改訂版の第二版の版権が空いていたので、アスキードワンゴから出すための作業をしていた。私は邦訳の査読をした。 今年になってから半年は、ずっとこのの査読をしていた。このためにC++標準化委員会の最新の文書を把握する作業が数ヶ月ほど滞った。そして、この仕事は、私がドワンゴに入社して以来、最悪の

    Bjarne Stroustrupのプログラミング入門書の査読の感想
    rryu
    rryu 2016/08/06
    C++は「一見このような意味に見える書き方だが実は全然違うものとして解釈される」という罠が多すぎないだろうか。
  • Big Sky :: MSVC の怖い話

    夏だし、怖い話しようぜ! #include <cstdio> #include <math.h> class C { public: C() {} C(double) { printf("hello world\n"); } }; int main(int argc, char** argv) { C(NAN); return 0; } 僕は今日... こんなコードをコンパイルしたんだ...。gcc でコンパイルして実行したんだ...。 hello world 期待通りだった。 僕は安心し、これを今度は MSVC でビルドしたんだ...。 実行すると... 何も出ない... 僕は怖くなった。 何なんだ!何なんだ!NaN なんだーーー! 僕の C++ 人生はなんだったのか...。僕は病に侵されているに違いない...。 怖いながらもデバッガで追ったんだ... そしてステップインした... えっ

    Big Sky :: MSVC の怖い話
    rryu
    rryu 2014/06/30
    変換コンストラクタの呼び出しと変数宣言はそんな微妙なところで区別されていたとは……
  • decltype(auto)

    C++14には、decltype(auto)が追加された。これは、autoと似ているが、微妙に違う。decltype(auto)は、初期化子の式をdecltype()の中に書いたのと同じ挙動をする。 つまり、以下のようになる。 int i = 0 ; int && f() ; auto a1 = i ; // int decltype(auto) a2 = i ; // int auto b1 = (i) ; // int decltype(auto) b2 = (i) ; // int & auto c1 = f() ; // int decltype(auto) c2 = f() ; // int && 単に、初期化子の式がiの場合は、autoもdecltype(auto)も変わりはない。 初期化子の式が(i)の場合は、型が違ってくる。なぜならば、括弧で囲った式は、decltype指定

    rryu
    rryu 2014/06/12
  • decltypeの二重括弧が参照になる理由

    こんにちは。みなさんのような優秀なプログラマなら、C++0xコードの脳内コンパイルぐらい普通に行っていると思うのですが、何しろC++0xの型システムは厄介です。そこで今回は、皆さんの脳の規格準拠度を調べてみることにしましょう。 C++0xにはdecltypeがあります。delctypeも知らないようでは、もはやC++0xプログラマとしては恥ずかしくて人前を歩けません。ところが、decltypeは悉達多プログラマには、少々難しいのです。 以下のコード辺を脳内コンパイルしたとき、皆さんの脳内には、どのような型情報が構築されているでしょうか int e ; #1 decltype(e) ; // #2 decltype((e)) ; // #3 まず、#1で、eの型は、当然intです。次のコードが脳内コンパイル可能かどうかは、皆さんの脳内コンパイラのバージョンによっても異なるのですが、今時C++

    rryu
    rryu 2014/06/12
  • 本の虫: decltypeの訓練

    こんにちは、脳内に優れたC++0xコンパイラをインストール済みのみなさん。今回は、あなたの脳内コンパイラが規格準拠かどうかを、さらにテストしてみましょう。 まずは、decltypeの決まりごとからです。優秀なみなさんのことですから、decltypeの決まりごとぐらい、当然暗記しているのは分かっていますが、念のために引用しておきます。 The type denoted by decltype(e) is defined as follows: — if e is an unparenthesized id-expression or a class member access (5.2.5), decltype(e) is the type of the entity named by e. If there is no such entity, or if e names a set of

    rryu
    rryu 2014/06/12
  • C++14でのreturnとreturn (…)の違い - Faith and Brave - C++で遊ぼう

    C++14で導入されるdecltype(auto)を使うと、returnとreturn (…)で戻り値の型が変わる。前者は値、後者は参照となる。 decltype(auto) f() { static int value = 3; return value; } decltype(auto) g() { static int value = 3; return (value); } int main() { int f_result = f(); int& g_result = g(); } 参照 C++11/14 and return( … ) vs return - StackOverflow C++14 通常の関数の戻り値型を推論

    C++14でのreturnとreturn (…)の違い - Faith and Brave - C++で遊ぼう
    rryu
    rryu 2014/06/12
    decltypeの仕様がそうだからそうなるのは分かるが実に罠っぽい。
  • 本の虫: rvalue reference 完全解説

    目的 この記事は、C++0xのrvalue referenceを完全に解説せんとする目的を以て書かれた。サンプルコードは最小に留め、エラー処理等は省いた。この記事さえ読めば、今日からrvalue referenceを恐れることなく使う物のC++0xプログラマになれるだろう。 lvalueとrvalueについて Cの時代では、lvalueとrvalueの違いは、代入演算子の左側か右側かという違いだけであった。つまり、left hand value, right hand valueの略である。従って、訳語も、左辺値、右辺値であった。C++においては、これはもはや正しくはない。従って、右辺値、左辺値というのも、誤訳である。それ故に、ここでは、これ以上、左辺値、右辺値という名称を使用しない。 誤解を恐れずにいえば、lvalueとは、明示的に実体のある、名前付きのオブジェクトであり、rvalue

    rryu
    rryu 2013/05/10
    テンポラリな値を識別する為の型というだけなのか。オーバーライドした関数なりでその性質を利用した処理を用意できるようになると。
  • 私立C++女学園 マルチスレッド科 - yamasaのネタ帳

    ここは私立C++女学園。 由緒あるこの学園も、時代の流れに押され大きな変革の時を迎えていた。新たに学園に設けられることとなった「マルチスレッド科」。物語はここから始まる…… 登場人物 memory_order_seq_cstさん 学級委員長。どんなことも完璧にこなす優等生であり、先生や他の生徒からの信頼も厚い。ただ、あまりの完璧主義者ゆえに、何でも全て順番どおりにやらないと気が済まないところが、ある意味欠点でもある。 memory_order_releaseさんとmemory_order_acquireさん シンクロナイズドスイミング部に所属する双子の姉妹。二人の息の合ったシンクロ演技には、部内に限らずファンが多い。学園内では、memory_order_seq_cstさんと人気を二分していると言ってよいだろう。 memory_order_acq_relさん あまり目立たない生徒だが、実はm

    私立C++女学園 マルチスレッド科 - yamasaのネタ帳
    rryu
    rryu 2011/04/02
    二人のvolatileさんはいとこなのかもしれない。
  • 1