タグ

ブックマーク / cpplover.blogspot.com (43)

  • 2018-11のC++ドラフトの主要な変更

    N4792 C++20のドラフトが更新された。今回も強めの変更が入っている。 まずconstexprが大幅に強化された。 p1002r1.pdf Allowing dynamic_cast, polymorphic typeid in Constant Expressions C++20での最終的な目標は、std::vectorやstd::stringをconstexpr対応させることだ。そのために従来ならば実行時処理であった様々な機能がconstexprに対応している。今回の変更では、try/catchブロックやdynamic_cast/typeidがconstexprに対応した。また、unionの有効なメンバーの変更もconstexprに対応した。 try/catchブロックはコンパイル時評価される場合、単に無視される。 dyanmic_cast/typeidは当にconstexpr

    tanakaBox
    tanakaBox 2019/01/08
    やば
  • 本の虫: Linus、今までの行いを謝罪し一時的にカーネルメンテナーの立場を退いて人の気持ちを勉強してくると発言

    Linus、今までの行いを謝罪し一時的にカーネルメンテナーの立場を退いて人の気持ちを勉強してくると発言 完全に背景事情を調べ上げたわけではないのだが、どうもLinusが毎年参加しているLinuxカーネルの会議に、Linusがスケジュールを間違えて参加できなくなるという事態が発生した。当のLinus人はもう20年も続いている会議だし自分がいなくてもやっていけるだろうと楽観視していたが、会議自体がLinusの都合にあわせてリスケジュールされた。 LinuxにおいてLinus Torvaldsといえば第一人者であり極めて重要な存在で、そのLinusが毎年参加している重要な会議にLinusが参加できないとあれば、その他のあらゆるコストを度外視して根回し調整を行い、Linusが参加できるようにイベント全体のリスケジュールを行うのは人間の感情から考えて当然である。しかし当のLinus人は他人の感情

    tanakaBox
    tanakaBox 2018/09/17
    何かが始まろうとしている気がする。
  • 濫用に当たる職務質問を受けたと考えたので弁護士に相談して訴訟を起こすことになった話

    去る7月3日の午後の通勤途中に、私は職務質問を受けた。その次第は以下のブログ記事に職務質問を受けた当日書いて投稿した。ただし、投稿時に日付を超えてしまったので投稿日時は7月4日になっている。 の虫: 警察官に職務質問をされた話 さて、振り返って見るに、私は先日の職務質問が警察官職務執行法第一条に規定された、「目的のため必要な最小の限度」を超えていて、「濫用」にあたるのではないかと考える。というのも、 「下を向いて歩いていた」、「帽子を目深にかぶっていた」という理由は、同法二条にある「合理的に判断して何らかの犯罪を犯し、若しくは犯そうとしていると疑うに足りる相当な理由」にはならない。 仮に「疑うに足りる相当な理由」であったとしても、職務質問を開始してかなり早い段階で、その疑いに対して「重い荷物を背負って長距離を歩いたので疲れたのではないか」、「人間は下ぐらい向くものだ」、「日差しが強く帽子

    tanakaBox
    tanakaBox 2017/08/18
    今度から、法律の読み合わせをしよう。
  • 最近のC言語の配列

    N4188を読んでいて、C言語の規格を参照する必要が出てきたので、C言語の規格を読んだのだが、最近のC言語の配列は、面白いことになっている。 以下はすべて最新のC規格で合法なコードである。 void f( char a[ * ] ) ; void g( char a[ static 100 ] ) ; void h( char a[ const volatile restrict ] ) ; void wtf( char a[ static const volatile restrict 1 ] ) ; これは、関数のプロトタイプ宣言でのみ許されている。 [*]は、サイズを指定しない可変長配列型である。関数のプロトタイプ宣言スコープの中でしか使えない。[]との違いは、完全形であることだ。 [static n]は、関数を呼び出した際の実引数は、少なくともn個の要素を持たなければならない。 v

    tanakaBox
    tanakaBox 2014/11/17
  • C++の例外指定

    C++では、関数に例外指定というものが記述できる。これはC++98からある機能で、throw(T1, T2, ...)という文法で、関数が外に投げる例外を指定する機能だ。 // C++98/03 void f() throw( int, double ) ; もし、関数が例外指定に指定された以外の型を投げた場合、std::unexpectedが呼ばれる。 void f() throw( int ) { throw 0 ; // OK throw 0.0 ; // 実行時エラー: call std::unexpected() } 例外指定は、関数から抜けだせる例外を指定する機能で、関数の外に例外を投げなければ問題がない。 void f() throw( int ) { try { throw 0.0 ; // OK } catch( ... ) { } // OK、外に投げない } というの

  • C++のtypeidとtype_infoとtype_index

    10月の論文集が発表されるまで暇なので、typeidとtype_infoと、C++11から追加されたtype_indexの解説をする。 C++でRTTI(Run Time Type Infomation/Identification)と呼ばれる機能がある。 std::type_infoは、型情報を表現するクラスである。type_infoのオブジェクトは、typeid式で得ることができる。typeid式は、オペランドに式かtype-idを取る。typeid式の結果は、constなstd::type_info型のlvalueである。typeid式を使うには、typeinfoヘッダーをincludeする必要がある。 #include <typeinfo> std::type_info const & t1 = typeid(int) ; std::type_info const & t2 = t

  • C++14の新機能: [[deprecated]] 属性

    [[deprecated]]属性とは、C++11で追加された属性の文法で指定できる機能である。 deprecated属性は、任意の名前やエンティティに指定できる。deprecated属性を指定された名前やエンティティは、依然として通常通り使用できるが、使用が非推奨になる。 [[deprecated]] int handy_global_variable ; int main() { handy_global_variable ; // 非推奨 } deprecated属性には、文字列リテラルを記述することもできる。 [[deprecated("Don't Use It!")]] int g ; deprecated属性は、クラス、typedef名、変数、非staticデータメンバー、関数、enum、テンプレートの特殊化に対して指定できる。それぞれの属性を記述する文法は以下の通り。 // ク

    tanakaBox
    tanakaBox 2014/10/03
    面白い。
  • C++14の新機能: 初期化lambdaキャプチャー

    C++14で追加された新機能を解説していくシリーズ第四弾。今回は、初期化lambdaキャプチャーを解説する。これは、提案では、汎用lambdaキャプチャーと呼ばれていたが、どうやら今は、もっとわかりやすい、初期化lambdaキャプチャーとも呼ばれているようだ。 C++14の初期化lambdaキャプチャーについて解説する前に、まず、C++11のlambdaキャプチャーと、その問題点について解説しなければならない。 lambda式は、自動ストレージ上にあるオブジェクトか、thisをキャプチャできる。 void f() { int x = 0 ; // コピーキャプチャ [=]{ return x ; } ; // リファレンスキャプチャ [&]{ x = 1 ; } ; } lambda式は、クロージャーオブジェクトという未規定の型のオブジェクトを生成する。lambda式がローカル変数をキャプ

  • emplaceとVariadic Templatesの世界一わかりやすい説明

    以下はC++03のinsertの原理である。 template < typename T > class container { private : alignas(T) char storage[ sizeof(T) ] ; T * ptr = nullptr ; public : void insert( const T & x ) { ptr = ::new(storage) T( x ) ; } } ; insertとは、何らかの方法で確保されたストレージ上に、オブジェクトを構築するのだ。placement newを使えば、任意の生のストレージ上に、オブジェクトを構築することができる。 push_backのようなメンバーは、insertのやや特殊なものである。 C++11では、ムーブセマンティクスを取り入れたため、insertにはrvalueリファレンスをとるものが追加された。 v

  • 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指定

  • cpの速度を計測する方法

    江添亮 自由ソフトウェア主義者 C++ Evangelist C++標準化委員会の委員 ドワンゴ社員 C++11を執筆した。 株式会社ドワンゴで働いている。 Mail:boostcpp@gmail.com Twitter:@EzoeRyou GitHub: https://github.com/EzoeRyou 江添亮のマストドン@EzoeRyou 筆者にブログのネタを提供するために、品物をアマゾンお気に入りリスト経由で送りたい場合: Amazon.co.jp: 江添亮: 江添のほしい物リスト 筆者にブログのネタを提供するために、直接に品物を送りたい場合、住所をメールで質問してください。 View my complete profile ► 2020 (31) ► December (2) ► November (2) ► September (2) ► August (4) ► Jul

  • GCC 4.9リリース

    GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF) GCC 4.9がリリースされた。少なくとも、公式Webサイトのトップページからは、リリースされたことになっている。ただし、なぜかリンクをたどると GCC 4.9 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF) GCC 4.9がリリースされた。興味深い変更点を上げると。 大昔の、もはや保守もテストもされていないようなプラットフォームのサポートがobsolete扱いになった。もし、活発な活動が行われない場合、次のリリースでは取り除かれるそうだ。特に、Solaris 9が挙げられている。 Cla

  • Variadic Templatesの解説

    Variadic Templatesである。Variadic Templatesとは、そもそも何か。 Variadic functionというものがある。最も身近な例は、printfである。 int printf ( char const * format, ... ) ; printf( "number: %d, string: %s", 123, "hello" ) ; このように、任意の数の引数をとることができる関数を、Variadic functionという。 Variadic Templatesは、任意の数の、テンプレート引数を取れるテンプレートである。 これまで、型安全に任意の数の引数を取る方法はなかった。もちろん、関数はオーバーロードできる。 template < typename T1 > T f( T1 const & t1 ) ; template < typename

  • 8086のバイナリが汚すぎる

    池袋バイナリ勉強会に参加して、8086の逆アセンブラーを作成しようとしているのだが、これが思いの外に難しい。いや、めんどくさい。 筆者は、これまでx86アセンブリには、ニーモニック経由でしか触れてこなかった。movはmovであり、それ以外の何者でもなかった。 mov ax, bx などと書いたら、これをアセンブラーにビット列に変換させて、その後は何も考えなかった。 既存のバイナリを逆アセンブラーにかけて読む場合でも、やはり逆アセンブラーがバイナリをニーモニックに変換してくれるので、やはりビット列による表現方法に関しては、考えたこともなかった。 さて、池袋バイナリ勉強会に参加したので、この機会に、逆アセンブラーでも実装しようと思い立った。そこで、Intelの当時の8086の資料を読んでみた。 Index of /Intel/x86/808x/datashts/8086 そして、絶望した。80

  • 池袋バイナリ勉強会に行ってきた

    「kernelvmの発表者に、プログラミングを学んでわずか半年にして、PDP-11エミュレーターを実装した強者がいる」 kernelvmに参加した南山まさかず君は筆者に言った。なんと、プログラミング初心者が半年でPDP-11エミュレーターを実装し得ただと? いったい我々は何をやっていたのだ。その強者と話がしてみたい。きっとまだプログラミングの基礎を覚える過程を記憶していて、プログラミングを学ぶ方法がわからない筆者として、興味深い話が聞けることであろうし、半年でPDP-11エミュレーターを実装できたのであれば、物のプログラマーの素質を持っているであろうから。 聞けば、その強者は、七誌氏の主催する、池袋バイナリ勉強会なる勉強会で学んだという。一体どのような勉強会なのだろうか。ひとまず、その勉強会に参加してみよう。幸い、今週の土日に、初心者向けの講座が開かれる。 池袋バイナリ勉強会の会場は、東

    tanakaBox
    tanakaBox 2014/06/07
    気になってた。
  • OpenGLでムカつくこと

    Rich Geldreich's Blog: Things that drive me nuts about OpenGL Valve社員のRich Geldreichが、OpenGLの設計が古臭すぎることについて不満を爆発させている。 OpenGLについてムカつくことを脳内ダンプしてみる(これは個人的な件秋であって、Valveや同僚の見解ではない。あと、ここ数年、OpenGLと格闘してきたので、今日は機嫌が悪い)。これを投稿する理由はこうだ。GL APIには再設計が必要だ。というのも、思うに、MantleやD3D12がどうせ昼飯前にOpenGL APIを駆逐してしまうだろうから、この問題については、今考える必要があるのだ。 ここに見れば些細な問題もある。単にAPIのトレースの問題というのもある。しかし、それらの問題が積み重なって、他の開発者にGL APIという環境に飛び込むよう誘うのを躊

  • Linux Torvalds、最近のCPUのPage Faultのコストにご不満の様子

    Linus Torvalds - Google+ - One of the things I end up doing is do a lot of performance… Linus Torvaldsが、最近のIntelのCPUは、通常以外の処理のコスト、つまりPage faultのコストが上がっているので、問題であるとしている。 俺はよくカーネルコードのパフォーマンスプロファイリングをやる。特に、VMとかファイルシステム周りに対してだ。 俺がよくやるのは、「うまくいってるとき」に対する計測だ。つまり、だいたいほぼ完璧にキャッシュされてる状況だな。というのも、俺はもちろんIOのことは気にかけているが、俺の個人的なワークロードはたいてい、うまくキャッシュされてるからだ。たとえば、俺にとってよくあるロードは、pullした後のフルカーネルビルドだ。これにどのくらいの時間がかかるかが問題になる

  • JavaScriptの自動セミコロン挿入

    JavaScriptでは、多くの文は、セミコロンという終端記号を明示的に記述して、文の終わりを示す。 var i = 0 ; ++i ; --i ; しかし、JavaScriptでは、一部の文脈で、セミコロンの省略が許されている。あたかも、セミコロンが自動的に挿入されたかのように振る舞う。これを、自動セミコロン挿入(Automatic Semicolon Insertion) ECMA-262 Edition 5.1 §7.9が規定する、自動セミコロン挿入の定義を、記事では解説する。 まず、三つの基的なルールがある。 プログラムを左から右にパースした時に、文法上許されないトークン(反則トークン, offending token)があった場合、以下の二つの条件のうちどちらかひとつ、もしくは両方を満たせば、セミコロンが自動的に挿入される。 反則トークンと前のトークンが、ひとつ以上の行終端子

  • 1/9998 = 0.0001 0002 0004 0008 0016 0032 0064 0128 0256...

    1/9998 = 0.0001 0002 0004 0008 0016 0032 0064 0128 0256... \(\frac{1}{9998}\)は、4桁で2^13まで2の累乗のパターンが出現する。 \[\frac{1}{9998} = 0.0001\;0002\;0004\;0008\;0016\;0032\;0064\;0128\;0256\;0512\;1024\;2048\;4096\;8193\;6387\;\cdots\] Hacker Newsによれば、これは以下のような理由による。 The pattern will break down once you get past 8192, which is 2^13. That means th\cdots | Hacker News このパターンは8192を超えると破れる。つまり、このパターンはすごいことに52桁も継続

    tanakaBox
    tanakaBox 2014/01/30
    おもろいなー
  • プログラマーのジョーク

    language agnostic - What is your best programmer joke? - Stack Overflow 私はコンピューターサイエンス科で教育しているが、何かユーモアによって場を盛り上げたい。ユーモアは場を退屈させず、物事を印象深くするし、物事を学ぶモチベージョンにもつながる。さらに、ジョークが技術的な理解を必要とするのであれば、さらにモチベーションが上がるのだ。 このstackoverflowの質問を受けて、様々なプログラマーのジョークが投稿されている。その評価順に紹介すると・・・ A man flying in a hot air balloon suddenly realizes he’s lost. He reduces height and spots a man down below. He lowers the balloon furth

    プログラマーのジョーク
    tanakaBox
    tanakaBox 2014/01/17
    大量