More Related Content
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか PDF
PDF
20分くらいでわかった気分になれるC++20コルーチン PDF
PPT
PDF
PDF
中3女子が狂える本当に気持ちのいい constexpr PDF
What's hot
PDF
PDF
PDF
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説 PDF
組み込み関数(intrinsic)によるSIMD入門 PDF
PDF
PDF
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する PDF
PPTX
PDF
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け PPTX
PDF
PDF
PPTX
最新C++事情 C++14-C++20 (2018年10月) PPTX
PDF
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ PDF
PPTX
C#や.NET Frameworkがやっていること Similar to 組み込みでこそC++を使う10の理由
PDF
PDF
Who enjoy a coding standard? PDF
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか) PPTX
PDF
PDF
Javaセキュアコーディングセミナー東京第2回講義 PPTX
PDF
PDF
PPTX
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ) PDF
PDF
PDF
Who enjoy a coding standard? ver. 0.20 PDF
PDF
PDF
PDF
DOCX
PPTX
PDF
組み込みでこそC++を使う10の理由
- 1.
- 2.
喋ること
• C滅びろ
• C滅びろ
• C滅びろ
• C滅びろ
• C滅びろ
- 3.
「Cを使う必然性」の幻想
• C++使うと遅くなるしCでいいよ
• …同じならCでよくね?
• いや例外とかでかいじゃん
• templateとかよくわかんないし
- 4.
- 5.
「C++遅い」の主要因
• 無意味な仮想関数
– dynamic polymorphismを使わないなら要らない
• newの乱発
– Cと同じように単にスタックに配置すればいい
• SjLj例外ハンドリング
– Dw2例外ハンドリングを使うか、OFFにする
- 6.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
ビットフィールドの克服
• こんなコードを用意しておけば…
struct addr_t{ size_t addr; };
template <typename T, int H, int L = H>
struct ioaccess_bit {
template <int = bitsizeof(H)-1, int = H>
struct gen_mask {
static constexpr T value = (~static_cast<T>(0)<<H+1) ^ (~static_cast<T>(0)<<L);
};
template <int h>
struct gen_mask<h, h> { static constexpr T value = ~(~static_cast<T>(0) << L); };
constexpr ioaccess_bit(addr_t addr): addr(addr.addr) { }
size_t addr;
// continue
- 23.
ビットフィールドの克服
• こんなコードを用意しておけば…
// continued
size_t addr;
static constexpr T mask = gen_mask<>::value;
constexpr T omit_bits(T x) { return x & ~mask; }
constexpr T extract_bits(T x) { return (x & mask) >> L; }
constexpr T shift_bits(T x) { return (x << L) & mask; }
volatile T *get_addr() const { return reinterpret_cast<volatile T *>(addr); }
operator T() const { return extract_bits(*get_addr()); }
ioaccess_bit operator =(T v) const {
T tmp = *get_addr(); *get_addr() = omit_bits(tmp) | shift_bits(v); return *this;
}
};
- 24.
ビットフィールドの克服
• こんな定義で…
struct {struct reg_t { struct can_mb_id_t {
struct bit_t {
static constexpr size_t base = 0x00090200;
size_t offset;
ioaccess_bit<uint32_t, 31> IDE = addr_t{base+offset};
ioaccess_bit<uint32_t, 30> RTR = addr_t{base+offset};
ioaccess_bit<uint32_t, 28, 18> SID = addr_t{base+offset};
ioaccess_bit<uint32_t, 17, 0> EID = addr_t{base+offset};
bit_t(size_t off): offset(off) { }
} BIT;
} ID; };
reg_t operator[] (size_t n) { return reg_t{{{n}}}; }
} MB;
- 25.
- 26.
割り込みマスク
• 割り込みを一時的にマスクしたいこと、有りますよね
• sti()/cli()でいいんだけど、もしネストされてたら…?
• というかcli()とか呼ぶの忘れますよね
• それC++なら自動化できるよ
- 27.
単純な例
struct lock_interrupt {
lock_interrupt() : masked(get_imask_ccr()) {
set_imask_ccr(1);
}
~lock_interrupt() {
set_imask_ccr(masked);
}
bool masked;
};
// in some function...
lock_interrupt lk;
// do critical action, let's forget unmask interrupt flag!
}
- 28.
醜い固定小数点演算
• Cで実数演算する場合は…
– double/floatを使う
– 整数を自前でシフトして使う
– 固定小数点演算ライブラリを作る
• 固定小数点を使う場合、演算子使えなくて大変です
よね…
• それC++ならスマートに出来るよ
- 29.
美しい固定小数点演算
fixed calc_1( void calc_1(
fixed v, fixed *result,
fixed u fixed *pv,
){ fixed *pu
v *= 1.5f; ){
return v + calc_2(u); fixed tmp;
} fixed_from_float(&tmp, 1.5f);
fixed_mul(pv, pu, &tmp);
calc_2(&tmp, pu);
fixed_plus(result, pv, &tmp);
}
- 30.
- 31.
- 32.