如何にして私は心配するのをやめてC++を愛するようになったのか

江添亮

江添亮

ドワンゴ社員

人体ハック中(減量)

C++の利点

  • C++は個人、企業に所有されていない
  • 言語仕様が国際規格で厳格に定められている
  • 独立した実装が複数ある
  • C言語との互換性

所有の弊害

JavaはOracleによって所有されている

Oracleの認定を受けないとJavaと名乗れない

ある程度目立つと叩かれる(Dalvik VM)

規格のない弊害

規格がないと実装がすべてとなる

独立した実装が複数ある

ClangとGCC

もうひとつぐらいほしいところ。

C言語との互換性

C99以降の言語機能には対応していない

C89との互換性は型システムを強化する際に結構なくなった

実用上は、CからC++への一方的なABI互換さえあればいい。

C++17

次のC++規格

2017年に正式に発行される予定

C++17に何が入るのか

それなりにいろいろと入る

コア言語には大きな変更はない

ライブラリはいろいろと入る。

コア言語

紹介できるわかりやすい機能がない

[[nodiscard]]

callerに戻り値を無視させない

戻り値のチェック してますか?

// ディスクにデータを書き込む
// 失敗するとfalseを返す
// 戻り値を無視するとデータ消失に気が付かない
bool commit_to_disk() ;
// スレッドを作って処理
// joinable()なスレッドを返す
// 戻り値を無視するとterminate()
thread spawn_work() ;

無視してはいけない戻り値がある

でもユーザーは無視する

無視されるのは言語が寛容だから

そこで[[nodiscard]]

関数に指定すると

戻り値が使われなかった場合、警告を発する

[[nodiscard]] bool f() ;

int main()
{
    f() ; // 警告
    bool b = f() ; // 無警告

    if ( f() ) // 無警告
        do_something() ;
    else
        do_error() ;
}

ライブラリ

<algorithm>の並列実行版

<filesystem>, <optional>, <any>, <string_view>などなど

おまけ

C++でAMラジオ鳴らしてみた

元ネタ

https://github.com/fulldecent/system-bus-radio

ご家庭のコンピューターはAMラジオ用の微弱無線局になる。

コンピューターが電力を消費するとき

一部は漏れて電磁波として放送される

電磁波ならばラジオで受信できるはず

ノイズは面白くない

音楽を鳴らそう

音階の表現方法

特定の周波数の矩形波を出す

矩形波の出し方

以下の計算式で求めた秒数だけ

\[\frac{1秒}{周波数 \times 2}\]

  1. 電力を消費する。
  2. 電力消費を控える
  3. goto 1.

電力を消費する方法

ビジーループを回す

複数のスレッドで回す

x86-64では、キャッシュを無視してメモリアクセスする命令が最も消費電力が高い

分解能

3000Hzの矩形波を出すためには

150マイクロ秒の処理が必要

あまりに処理時間が掛かり過ぎると

望みの周波数が出せない

電力を消費しない方法

sleep

分解能が重要

3000Hzの矩形波を出すためには

150マイクロ秒だけsleepする必要がある

高分解能なタイマーとsleepが必要

高分解能タイマー

Linux - clock_gettime

XNU - mach_absolute_time

Windows NT - QueryPerformanceCounter

高分解能sleep

Linux - nanosleep

Mac OS X - clock_sleep_trap

Windows - 存在しない

オリジナルの実装

  • C言語
  • スレッドは使わない
  • 電力消費に_mm_stream_si128(x86,x86-64)を使用
  • 高分解能タイマーにmach_absolute_time(Mac OS X)を使用
  • 高分解能sleepにclock_sleep_trap(Mac OS X)を使用

Mac OS Xでしか動かない

C++に書き直してやれ

C++11移植

  • threadとcondition variable
  • 電力消費にatomic操作
  • 高分解能タイマーにhigh_resolution_clock
  • 高分解能sleepにthis_thread::sleep_until

結果

LinuxとMac OS Xで動くようになった

Windowsでの動作は未報告

コンパイルは通るらしい

高精度sleepがないので動作は絶望的

オマケ

人体ハック(減量)

体重が増えてしまった

減量しなければならない

人体はハックできる

(人間は減量できる)

脂肪を減らしたい

筋肉は減らしたくない

脂肪

酸素と結合することにより、

1kgあたり7200k calのエネルギーを取り出せる

エネルギーを取り出すと残りは水と二酸化炭素

\[1脂肪 + 2.9酸素 = エネルギー + 2.8二酸化炭素 + 1.1水 \]

都市伝説:脂肪は筋肉になる

多くのハッカーではないトレーナーが信じる妄想

減量の原則

痩せる重量の計算方法

\[\frac{摂取キロカロリー - 消費キロカロリー}{7200kcal} = 脂肪(kg)\]

摂取カロリーとは食事

消費カロリーとは運動

一ヶ月で1kg痩せるには

一ヶ月7200kcalを食事か運動で減らす

一日あたり240kcal

運動で減らす

ジョギングの消費カロリー

\[ 体重(kg) \times 距離(km) = 消費キロカロリー\]

体重70kgの人間が

1km走ると70kcal

4km走ると280kcal

8km走ると560kcal

食事で減らす

ご飯茶碗一杯(140kg)が235kcal

羊羹(155g)が434kcal

きのこの山一箱417kcal

たけのこの里一箱391kcal

ニコナレ

http://niconare.nicovideo.jp/

SaaSなスライド資料ホストサービス