Inicio
Explorar
Enviar búsqueda
Cargar
Iniciar sesión
Registrarse
Publicidad
組み込みでこそC++を使う10の理由
Denunciar
kikairoya
Seguir
10 de Jun de 2012
•
0 recomendaciones
28 recomendaciones
×
Sé el primero en que te guste
ver más
•
26,836 vistas
vistas
×
Total de vistas
0
En Slideshare
0
De embebidos
0
Número de embebidos
0
Check these out next
プログラムを高速化する話
京大 マイコンクラブ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
中3女子でもわかる constexpr
Genya Murakami
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
闇魔術を触ってみた
Satoshi Sato
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
オブジェクト指向できていますか?
Moriharu Ohzu
1
de
32
Top clipped slide
組み込みでこそC++を使う10の理由
10 de Jun de 2012
•
0 recomendaciones
28 recomendaciones
×
Sé el primero en que te guste
ver más
•
26,836 vistas
vistas
×
Total de vistas
0
En Slideshare
0
De embebidos
0
Número de embebidos
0
Descargar ahora
Descargar para leer sin conexión
Denunciar
Tecnología
kikairoya
Seguir
Publicidad
Publicidad
Publicidad
Recomendados
Constexpr 中3女子テクニック
Genya Murakami
32.7K vistas
•
138 diapositivas
競技プログラミングのためのC++入門
natrium11321
32.9K vistas
•
63 diapositivas
ゲーム開発者のための C++11/C++14
Ryo Suzuki
102.3K vistas
•
157 diapositivas
すごい constexpr たのしくレイトレ!
Genya Murakami
25.3K vistas
•
206 diapositivas
C++ マルチスレッドプログラミング
Kohsuke Yuasa
107.3K vistas
•
97 diapositivas
クロージャデザインパターン
Moriharu Ohzu
19.5K vistas
•
146 diapositivas
Más contenido relacionado
Presentaciones para ti
(20)
プログラムを高速化する話
京大 マイコンクラブ
•
239.8K vistas
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
•
51.7K vistas
中3女子でもわかる constexpr
Genya Murakami
•
47K vistas
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
•
12.3K vistas
闇魔術を触ってみた
Satoshi Sato
•
6.6K vistas
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
•
1.7K vistas
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
•
8.8K vistas
オブジェクト指向できていますか?
Moriharu Ohzu
•
235.7K vistas
すごいConstたのしく使おう!
Akihiro Nishimura
•
13.2K vistas
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
•
34.1K vistas
C++ マルチスレッド 入門
京大 マイコンクラブ
•
57.5K vistas
冬のLock free祭り safe
Kumazaki Hiroki
•
26.7K vistas
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
•
9.3K vistas
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
•
45.9K vistas
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
•
30K vistas
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
•
14.7K vistas
コルーチンでC++でも楽々ゲーム作成!
amusementcreators
•
7.4K vistas
不遇の標準ライブラリ - valarray
Ryosuke839
•
7.3K vistas
C++のビルド高速化について
AimingStudy
•
6.6K vistas
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
•
3.9K vistas
Similar a 組み込みでこそC++を使う10の理由
(20)
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
•
12.3K vistas
マーク&スイープ勉強会
7shi
•
5.6K vistas
C++0x総復習
道化師 堂華
•
4.9K vistas
C++ tips4 cv修飾編
道化師 堂華
•
4K vistas
.NET Core 2.x 時代の C#
信之 岩永
•
6.2K vistas
Objc lambda
matuura_core
•
2.1K vistas
C++ tips 3 カンマ演算子編
道化師 堂華
•
6.2K vistas
C++11概要 ライブラリ編
egtra
•
3K vistas
Brief introduction of Boost.ICL
yak1ex
•
692 vistas
Emcpp item31
mitsutaka_takeda
•
10.3K vistas
C++0x in programming competition
yak1ex
•
1K vistas
Visual C++コード分析を支えるSAL
egtra
•
4.1K vistas
Pfi Seminar 2010 1 7
Preferred Networks
•
3.4K vistas
Hupc 1
Hiroki Takeda
•
133 vistas
C++0x 言語の未来を語る
Akira Takahashi
•
1.7K vistas
Python physicalcomputing
Noboru Irieda
•
1.5K vistas
C++11のつかいかた
amusementcreators
•
1.1K vistas
わんくま同盟大阪勉強会#61
TATSUYA HAYAMIZU
•
952 vistas
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
•
5.2K vistas
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
•
4.7K vistas
Publicidad
Último
(20)
留信网认证可查【拜欧拉大学文凭证书毕业证购买】
1lkjhg
•
3 vistas
PCベース制御による集中制御.pdf
ssusercd9928
•
19 vistas
SoftwareControl.pdf
ssusercd9928
•
15 vistas
統計学の攻略_推測統計学の考え方.pdf
akipii Oga
•
91 vistas
Oracle Cloud Infrastructure:2023年5月度サービス・アップデート
オラクルエンジニア通信
•
25 vistas
20230516 @Mix Leap Hirohiko_Suwa
Masashi Nakagawa
•
82 vistas
《杨百翰大学毕业证|学位证书校内仿真版本》
d520dasw12
•
2 vistas
JSTQB_テストマネジメントとレビュープロセス.pdf
akipii Oga
•
66 vistas
①【威斯康星大学麦迪逊分校毕业证文凭学位证书|工艺完美复刻】
C25lokh12
•
3 vistas
UAV写真・レーザー測量test.pptx
ssuserb48d2b1
•
13 vistas
オレオレになりがちなテスト計画を見直した話
terahide
•
25 vistas
第2回Matlantis User Conference_20230421_久間薫先生
Matlantis
•
289 vistas
初学者のためのプロンプトエンジニアリング実践.pptx
Akifumi Niida
•
305 vistas
【DL輪読会】Flow Matching for Generative Modeling
Deep Learning JP
•
681 vistas
シン3次元表示装置 ーその1ー
Takashi Yamanoue
•
132 vistas
①【阳光海岸大学毕业证文凭学位证书|工艺完美复刻】
vgh215w
•
2 vistas
①【戴尔豪斯大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 vistas
第2回Matlantis User Conference_20230421_畠山歓先生
Matlantis
•
361 vistas
20230523_IoTLT_vol99_kitazaki_v1.pdf
Ayachika Kitazaki
•
105 vistas
統計学の攻略_正規分布ファミリーの全体像.pdf
akipii Oga
•
87 vistas
組み込みでこそC++を使う10の理由
組み込みでこそ C++を使う100の理由 Aiming 大阪社内勉強会 2012-06-11 @kikairoya
喋ること •
C滅びろ • C滅びろ • C滅びろ • C滅びろ • C滅びろ
「Cを使う必然性」の幻想 •
C++使うと遅くなるしCでいいよ • …同じならCでよくね? • いや例外とかでかいじゃん • templateとかよくわかんないし
C++使うと遅くなるしCでいいよ • そうでもない • 同じことを実現しようとすれば、ほぼ正確に同じだけ
の命令数が必要 – Cで書いてもC++で書いても生成コードサイズは 大して変わらない(RTTIと例外テーブルは除く) • 20年前の昔なら兎も角、21世紀も10年過ぎた現在 ではJavaですらCより速い場合がある
「C++遅い」の主要因 • 無意味な仮想関数
– dynamic polymorphismを使わないなら要らない • newの乱発 – Cと同じように単にスタックに配置すればいい • SjLj例外ハンドリング – Dw2例外ハンドリングを使うか、OFFにする
おまけ:Javaのパフォーマンス • http://blog.cfelde.com/2010/06/c-vs-java-
performance/ とか g++ 4.3 vs Sun Java HotSpot VM, version 1.6.0_20
…同じならCでよくね? • んなこたない • C++でしか出来ないことはあるけれど、Cでしか出来
ないことはほとんど無い – C99の複合リテラル・名前付き初期化くらい – どちらもC++で似たような機能は実現可能 – C89に限定すれば事実上「全く」無いと言える
いや例外とかでかいじゃん • そげなことない • 不要ならOFFにすればいいだけ •
RTTIも同様 • 例外飛ばしてたらリアルタイム性守れない場 合があるので、その場合はOFF • 例外無くてもデストラクタは正しく走るので、リ ソース管理も安全安心
templateとかよくわかんないし • 面倒な部分はライブラリ側に全部隠せます • エラーコードは確かに量多いですが…
実行時に不思議な挙動をするか コンパイル時に説教されるか どっちがいいですか? • コンパイル通した時点でデバッグ終了が理想 – 現実は厳しいけれど、コンパイラが見つけ てくれるエラーの量はCとは段違い
便利で危険なprintf • printfって便利だけど危ないよね… • sizeof(int)==2の環境だと特に問題が顕在化
しやすい • それC++なら型安全に出来るよ • ntfmtとか • cprintfとか
printfの罠 • たとえばこんなコード extern int
g_value_for_something; void logger() { printf("value:%d¥n", g_value_for_something); }
printfの罠 • 「intが16ビットですぐ溢れるからlongにしよう」 extern long
g_value_for_something; void logger() { printf("value:%d¥n", g_value_for_something); }
printfの罠 • 「intが16ビットですぐ溢れるからlongにしよう」 extern long
g_value_for_something; void logger() { !!!フォーマット指定子を変え忘れた!!! printf("value:%d¥n", g_value_for_something); }
constexprなprintfなら • 変え忘れたらコンパイルエラーにできます extern long
g_value_for_something; void logger() { cprintf("value:%d¥n", g_value_for_something); } FORMAT_ERROR_format_specifier_d_takes_int_but_ given<T>::fail() [with T = long int]
void *パレード • Cで汎用コンテナやアルゴリズム作ろうとする
と、void *の山になりますよね… • ライブラリで閉じていればまだいいけど、ユー ザコードでvoid *からキャストする必要がある • それC++なら型安全に出来るよ • STLとか
ビットフィールドの恐怖 • 組み込みでも一番低いレイヤではハードウェ
アレジスタを叩く必要がある • Cだとよくビットフィールド使うけれど… • GCCでは間違ったアドレスにアクセスすること がある!
ビットフィールドの恐怖 • こんなありふれたコードから… volatile struct
{ volatile unsigned int a: 8; volatile unsigned int b: 4; } bitfield; int main() { bitfield.a = 1; }
ビットフィールドの恐怖 • こんな恐ろしいコードが!!!
movl $1, bitfield+3(%rip) ↑ (bitfield+3)番地に32ビットで書き込み
ビットフィールドの恐怖 • 組み込みでも一番低いレイヤではハードウェアレジ
スタを叩く必要がある • Cだとよくビットフィールド使うけれど… • GCCでは間違ったアドレスにアクセスすることがあ る!(注: BTSにパッチ投稿済) – ベンダコンパイラでもコンパイルオプション一つで ビットオーダーが変わることがある • それC++なら安全でポータブルに出来るよ
ビットフィールドの克服 • こんなコードを用意しておけば… 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
ビットフィールドの克服 • こんなコードを用意しておけば… // 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; } };
ビットフィールドの克服 • こんな定義で… 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;
ビットフィールドの克服 • こんなコードが書けます。 int n
= MB[0].ID.BIT.SID; MB[0].ID.BIT.EID = 12; assert(MB[1].ID.BIT.IDE == 1);
割り込みマスク •
割り込みを一時的にマスクしたいこと、有りますよね • sti()/cli()でいいんだけど、もしネストされてたら…? • というかcli()とか呼ぶの忘れますよね • それC++なら自動化できるよ
単純な例 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! }
醜い固定小数点演算 • Cで実数演算する場合は…
– double/floatを使う – 整数を自前でシフトして使う – 固定小数点演算ライブラリを作る • 固定小数点を使う場合、演算子使えなくて大変です よね… • それC++ならスマートに出来るよ
美しい固定小数点演算 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); }
美しい固定小数点演算 • 演算子オーバーロードは用法・容量を守って
正しく使いましょう。
まずは簡単なところから • たとえC++の機能を使っていなくても、拡張子は.cpp
にしましょう • マクロで定数やインライン関数を書くのはやめて、 static constやinlineを使いましょう • テンプレートを「書く」のは慣れてからで十分 • 千里の道も一歩から C++マスターもBetter Cから
おしまい • Let's C++!!!
Publicidad