雑記帳

ちょっとした文章とかメモ書きとか。

boost勉強会 #8 大阪に行って来ました。

以下org-modeをhtmlにエクスポートしたもの少し手直ししたメモです。

boost勉強会 #8

1 boost勉強会

1.1 boost勉強会とは

1.1.1 比較的オープンな感じの勉強会…?

1.1.2 質問に関して

2 1つ目の発表

2.1 (@cpp_akira)さん

2.1.1 RAII

  • 確保したリソースは自動的に解放されるBoost.ScopeExitを使おう
    スコープを抜ける際に実行されるブロックを記述する
    [C++11のlambda実装]
    boost1.50へ?
  • ScopedLocking パターン
  • Boost.ScopedExitを使ってみよう。色々な箇所で使うならライブラリ化しよう

3 2つ目の発表

3.1 道化師さん

3.1.1 カンマ演算子の話

[最も優先順位の低い演算子]

  • 使用例:if,switch,while,for,引数あんまり遊んでいるとスタックオーバーフローに…。
  • インラインロック
  • オーバーロード→メンテナンス性が著しく下がる。C++03ではバギー…。C++11では初期化リストあるしいらない…。
    [昼休憩]

4 3つ目の発表

4.1 秋猫さん

4.1.1 C++でテスト駆動開発

テスト駆動開発
Google Test
・豊富な機能
・比較的癖がない

  • 致命的なアサーション、致命的でないアサーション
  • Testフィクスチャ機能テストスイート毎の初期化/終了処理
  • Cutterテストは共有ライブラリで実行
  • ドキュメントが親切すぎて(rytest_()な関数にして実行
    ・cut_startup()
    ・cut_shutdown()
    ・etc.
    C++の機能は後付け?
  • CppUnit/CxxTest/QtTestLib/UnitTest++
  • モックライブラリGoogleMock/Mockitopp
  • テスト駆動開発とは実装を行いそれに対するテストを書く
    ・テストコードを書く
    ・実行して失敗することを確認
    ・最低限の実装
    ・実行して成功する事を確認
    ・テストが通る状態のままリファクタリングを行う
    ・1~5をリズム良く
  • ダメージ計算・仕様変更
    ・TDDでするには?[実演]
  • テスト駆動開発の恩恵・直ぐに実行可能なテストがある
    ・変更によるバグの混入を防げる
    ・めんどくさいからで確認しない事を防げる
  • 使いやすいインターフェース・テストを書く=使い方を考える
    ・先に使い方を考えるので使いにくいインターフェースを防げる
    ・凝集度の高い関数
    ・使い方を考えることは設計をする事にも繋がる
    ・設計について考える機会が増える
  • テスト駆動開発に必要な知識・テストに関する知識
    ・設計に関する知識
    ・リファクタリングに関する知識
  • テストの種別・ブラックボックステスト
    要件や仕様に基づいたテスト
    ・ホワイトボックステスト
    内部の実装や構造に基づくテスト
  • ピンポイントテスト仕様書をみて嫌な予感がする所をテスト
    コードを書いて(ry
    間、対象、類推、外側を考える
    意地悪条件を考える
    マインドマップを使うと効果的
  • 同値クラステスト・値の範囲で同じ振るまいをする部分が同値
  • 境界値テスト・境界となる値はバグが発生しやすい
    ・境界に着目してテストをする手法
    ・各同値クラスの境界となる値とその直前/直後の値をテストする
  • テストに対する懸念点
    • 分割されてパフォーマンス悪いんじゃ?・パフォーマンスの問題が起きる場所は特定の箇所
      ・最適化しか考えていないコードは(ry
  • テスト問題・テストしにくい場所
    ・そこ以外のテストが出来ていれば問題箇所が絞れる
    [参考書籍など]

    • TDD Advent Callender

5 4つ目の発表

5.1 aizenさんの発表

5.1.1 カスタムメモリマネージャと高速なメモリアロケータについて

  • 自己紹介しょくしゅ軍団こわい
    Vimmer/HHKB/SKK(ry
    「普通の」C++er
  • カスタムメモリマネージャメモリ確保を監視、もしくは変更する
  • 何が嬉しいかメモリをどこで確保したか分かる
    newをオーバーロードして使う
    メモリアラインメントが指定出来る
    状況によってメモリセクションを使い分ける事が出来る
    メモリの断片化で確保出来ない…と言う時に断片化具合を診断出来る
    ヒープ/フリーストアからメモリを使う
    16byteとかのアラインメントを指定出来る
    →CPUの速度を落とさない為に
    データを置くセクションを指定する/分ける
  • 楽な事ばかりじゃない・メモリ破壊
    ・気軽にやろうとは思わないこと
    ・コンソールゲームでは出来ないとしょうがない
  • メモリーリークを調べる・newした箇所を記憶し、どこで確保したか
    ・確保したメモリをリスト化
    ・例えばゲームステージの開始と終了とをチェック
  • エラーチェック・メモリ確保時にヘッダー情報を追加しておく
    ・メモリ確保時にサイズ末尾にマーカー情報を書き込む
  • 更にもっと高度なメモリ管理・デフラグ メモリコンパクション
    断片化は長く起動するアプリケーション程起きやすい
    メモリの再配置
  • スマートポインタでポインタをラップスマートポインタでポインタをラップしてデフラグ
  • デフラグコストの例
  • メモリ管理はとても便利だけれど危険
  • 高速なメモリアロケータmalloc/new
    ->placement new
  • 様々なアロケータ・スタックアロケータ
    メモリを自由に解放出来ない
    ・両端スタックアロケータ
    断片化が起こらず高速に動作していたらしい
    ・シングルフレームアロケータ
    扱いは難しいが割り切って使えばいいとか
    ・ダブルバッファアロケータ
    1フレームだけ長生き
    自分でdeleteする必要が無い
    ・スモールオブジェクトアロケータ
    32byte程度までは速い?
    Lokiのライブラリの中ではあらゆるものに使われて高速に動作
    ・メモリプールアロケータ
    固定長サイズの領域から固定サイズのメモリを確保する
    Efficient C++ Memory Pool
    Boost.Pool
    かなり万能なアロケータ
    断片化知らず[実演]

    ・汎用メモリプール
    newで確保するもの全てメモりプールから取得
    メモリマネージャ内に5つ程度のメモリプールを確保
    [メモリプール実演]

  • 結論メモリプールを使って自分でフックして重い部分を軽く!!

6 5つ目の発表

6.1 lapisさん

6.1.1 自己紹介

学生 兼 Perler
転職してC++er予定

6.1.2 5 Libraries I haven’t yet talked about

-> 4 Libraries

  • Boost.Flyweightconst T
    [アドレスを表示]
  • Boost.CircularBuffer循環バッファ
    インデックスが最後のバッファに到達すると最初を指す
    スマートポインタの仕様が推奨
    地味にデバッグモードあり
    [出力]
  • Boost.Pool・メモリプール
    高速にメモリアロケート出来る
    ゲームでちっさい一杯のオブジェクト管理
    メモリが不足したら例外を投げるのが推奨
    singleton.pool
  • Boost.uuid汎用一意識別子
    16バイトで現すユニークな値

7 6つ目の発表

7.1 hotwatermorningさん

7.1.1 Boost.Test

  • Boost.Testとは・Execution Monitor
    基礎となる。関数の実行を監視して統一的なエラーリポーティング機能を提供する
    受け取れる文字列は三種類
    C string
    std::string
    std::exceptionから派生したクラス
    boost::executeで呼び出すregister_excpeion_register
  • Program Execution Monitorcpp_main関数でプログラムを始める
  • Minimal Testing Facility・テスト作成の為の基本的機能を提供
    ・test_mainからプログラムを開始する
    BOOST_CHECK( … )
  • Unit Test FrameworkBoost.Testのメイン機能
    Unit Testing Framework
    シンプルで書きやすく
    最初は詳細に、最後は買いつまんで。
    constexprみたいにコンパイル長いのは(ry
    →多岐にわたる機能を提供する
    面倒なエラー検出とか実行時エラー検出云々を…
    [サンプルコード]
    UTFをスタティックリンクする機能はMacでは使えない…?
  • External Test Runner Variantビルドインではない
    ・#define BOOST_DYLINK…
    dll/dylibとかにしてリンクすると使えるように
  • テストの作成と組織化テストの定義と組織化
    ・BOOST_AUTO_TEST_CASE
    ・BOOST_AUTO_TEST_CASE_TEMPLATE
    テストスイートを定義する
    テストスイートを入れ子に出来る
  • Fixtureテストのセットアップ/ティアダウンを行う
    3つのレベルでFixtureを行える
    ・テストケース毎
    ・テストスイート毎
    ・グローバル
    Fixtureを同じソース内に使う場合は注意が必要
  • テストの出力・Test Logのレベル
    Human Readableとかの形式
    ・Test Repote
    ・Progress Display
  • 実行時のテスト設定環境変数又は実行時引数でログ出力の挙動を設定する
  • Testing Toolsflavors
    エラーチェック
    require エラーカウント増加/実行中断
    BOOST__EQUAL
    ドキュメントに色々あるよ!
    [デモ]
  • 結論実行時にスキップするテストを選ぶ事が出来ない
    Mockの仕組みが無い←アンドキュメント??

8 7つ目の発表

8.1 村上ボレロさん

8.1.1 constexpr

  • 趣味はconstexpr
  • constexprとはconstexprで宣言されるとコンパイル時/実行時にも呼び出せる
    引数は定数式にならない
    Sprout C++ Library
  • constexprとTMP連携クラステンプレートにコンポパイル時定数を渡すには
    index_tuple_idiom
    boost::mpl
    整数型を渡す
    [デモ]
    ポインタ型をテンプレート引数にする事は可能
    ローカル変数。一時オブジェクト、文字列リテラルはテンプレート引数に渡せない
    プロキシクラスをテンプレート引数に渡す
    [デモ]
    index_tupleとindex_rangeヘルパ
    [デモ]
    パラメータパック
    TMPでindex_tupleを使う
    [デモ]
    index_idiomはインデックスアクセスするものに適用可能
    型文字列とconstexpr文字列の相互変換
  • constexprでレイトレーシング(続)鏡の部屋の2つの球
  • まとめconstexprで型とか色々いじれる

9 8つ目の発表

9.1 でちまるさん

9.1.1 プリプロセッサ

  • 自己紹介本職はCプリプロセッサ
    コンパイル時とかオワコン(e?
  • 用語関数形式マクロ ― 引数のあるマクロ
    パラメータ ― 引数に置き換えられる予定の識別子
    置換リスト
    トークン列
  • 大まかな規則ファイル内のトークンを走査して行く
    マクロ系が見つかったら
  • 関数形式マクロ関数形式のマクロ名と(が並んでいるのが見つかったら置き換え
    トークンが含まれていないマクロの引数は…?
    制限
    再帰出来ない
    再帰めいた処理を行う方法が一部の状況では出来る
  • まとめプリプロセッサ怖くない(?

10 9つ目の発表

10.1 kikairoyaさん

10.1.1 SEH on MinGW

  • SEH(構造化例外)とはWindowsシステムが使う例外
    __try { …
    } __except { …
    }
    __try { …
    } __finaly { …
    }
  • 例外ハンドラの登録スタックの構造
    巻き戻し先の探索
  • SEHの実現方法巻き戻し実行
  • GCCでも使いたい!構造化例外のライブラリ実装
    黒魔術の山
    setjmp/longjmpを使ってスタックを縦横無尽に
    →丸々アセンブラ
    filterの呼び出し
  • RtlUnwindアセンブラでゴリゴリと
  • スタックの巻き戻しfinally blockの実行とデストラクタの呼び出し
    →デストラクタにはC++の例外を呼び出す必要がある
    bbpを操作して
    戻りアドレスを偽装してfinallyブロックから例外が発生したように振る舞う
    ハンドラへ
    x86アセンブラの嵐!!
  • スタック破壊巻き戻す毎にスタックは短くなる
    巻き戻し中はコーススタックをヒープに一時退避
  • 制限事項-fnon-call-exceptionを付けないとleaf-function上にある
    オブジェクトのデストラクタが呼ばれない
    VCのそれとは互換性が無い
    某ランドの特許に引っかかるか不明
  • まとめMinGWで動くSEH構文を実装した

11 懇親会

11.1 普段ツイッター上で交流のある方、新たに交流を始める方等の出会いがありました。

11.1.1 お酒の席でわいわいと喋ってました。僕の知っているC++じゃない…だと?!な勉強会でした。

うーん…org-modeの出力は果たしてどうなんだろうこれ…w

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。