Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C++ FAQ++ #TechLunch
Search
Livesense Inc.
PRO
April 23, 2014
Technology
0
28
C++ FAQ++ #TechLunch
2012/02/22(水) @ Livesense TechLunch
発表者:桂 大介
Livesense Inc.
PRO
April 23, 2014
Tweet
Share
More Decks by Livesense Inc.
See All by Livesense Inc.
27新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
0
2.4k
株式会社リブセンス・転職会議 採用候補者様向け資料
livesense
PRO
0
51
株式会社リブセンス 会社説明資料(報道関係者様向け)
livesense
PRO
0
1.5k
データ基盤の負債解消のためのリプレイス
livesense
PRO
0
440
26新卒_総合職採用_会社説明資料
livesense
PRO
0
11k
株式会社リブセンス会社紹介資料 / Invent the next common.
livesense
PRO
1
37k
26新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
1
13k
中途セールス職_会社説明資料
livesense
PRO
0
260
EM候補者向け転職会議説明資料
livesense
PRO
0
130
Other Decks in Technology
See All in Technology
大「個人開発サービス」時代に僕たちはどう生きるか
sotarok
20
9.6k
DevIO2025_継続的なサービス開発のための技術的意思決定のポイント / how-to-tech-decision-makaing-devio2025
nologyance
1
370
Function Body Macros で、SwiftUI の View に Accessibility Identifier を自動付与する/Function Body Macros: Autogenerate accessibility identifiers for SwiftUI Views
miichan
2
180
5分でカオスエンジニアリングを分かった気になろう
pandayumi
0
180
Firestore → Spanner 移行 を成功させた段階的移行プロセス
athug
1
430
AWSで始める実践Dagster入門
kitagawaz
1
570
5年目から始める Vue3 サイト改善 #frontendo
tacck
PRO
3
210
企業の生成AIガバナンスにおけるエージェントとセキュリティ
lycorptech_jp
PRO
2
150
LLMを搭載したプロダクトの品質保証の模索と学び
qa
0
1k
実践!カスタムインストラクション&スラッシュコマンド
puku0x
0
330
「全員プロダクトマネージャー」を実現する、Cursorによる仕様検討の自動運転
applism118
15
6.5k
20250903_1つのAWSアカウントに複数システムがある環境におけるアクセス制御をABACで実現.pdf
yhana
3
540
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
72
11k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
The Invisible Side of Design
smashingmag
301
51k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
How to train your dragon (web standard)
notwaldorf
96
6.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Transcript
C++ FAQ++
[email protected]
reinterpret_castはどこで使うのか • 物理リソース(外部デバイスの制御レジスタなど) とそれらの最も基本的なソフトウェア制御 • これらは特定のアドレスに依存する Device_driver* p = reinterpret_case<Device_driver*>(0xffb8);
#include <iostream> class Foo { public: Foo(int n): _n(n) {}
int get() { return _n; } private: int _n; }; int get_foo_address() { int foo_address = reinterpret_cast<int>(new Foo(11211)); return foo_address + 3306; } int main() { int foo_address = get_foo_address() - 3306; Foo* foo = reinterpret_cast<Foo*>(foo_address); std::cout << foo->get() << std::endl; // 11211 return 0; }
const_castはどこで使うのか • 値を変更しないのにconst指定されてない関数 にconstを渡すとき • constメンバ関数と非constメンバ関数でコードを 共通化するとき
void cout_n(int n) { cout << n << endl; }
void cout_const_pn(const int* n) { cout << *n << endl; } void cout_mutable_pn(int* n) { cout << *n << endl; } int main() { const int* n = new int(123); cout_n(*n); cout_const_pn(n); cout_mutable_pn(const_cast<int*>(n)); return 0; }
const Variable & Function variable • const int n =
1; pointer • const int* n = new int(1); • int* const n = new int(1); • const int* const n = new int(1); function • const int* const plus3(const int n)
const Member function • constなオブジェクトに対して使われる • 不変性を約束するメンバ関数
class TextBlock { public: TextBlock(std::string t): text(t) {} const char&
operator[] (std::size_t position) const { return text[position]; } char& operator[] (std::size_t position) { return text[position]; } private: std::string text; }; int main() { TextBlock tb("Hello"); const TextBlock ctb("Hello"); tb[1] = 'a'; ctb[1] = 'a'; // Error! std::cout << tb[1] << std::endl; std::cout << ctb[1] << std::endl; return 0; }
class TextBlock { public: TextBlock(std::string t): text(t) {} const char&
operator[] (std::size_t position) const { return text[position]; } char& operator[] (std::size_t position) { return const_cast<char&>( static_cast<const TextBlock&>(*this)[position] ); } private: std::string text; }; int main() { TextBlock tb("Hello"); const TextBlock ctb("Hello"); tb[1] = 'a'; ctb[1] = 'a'; // Error! std::cout << tb[1] << std::endl; std::cout << ctb[1] << std::endl; return 0; }
mutableとは何か • constがついたオブジェクトでもmutableがついて いるメンバ変数は変更可能 • 「論理的不変性」を保持するために使用 private: mutable int n;
RTTI(実行時型情報) • Run-Time Type Identification • typeid(*p).name(); でクラス名が取れる • get_classとかinstanceof的なもの
• 多重継承や例外と同様多くの議論を招いた 反対派 • 要らない。C++の精神に反している。複雑で難し い。 賛成派 • 一部の人にとっては重要。使わない人には無 害。実装しないと勝手実装される。
RTTI(Googleコーディング規約) • ユニットテストならOK • それ以外では仮想関数・ダブルディスパッチを 使うこと • If you think
you truly cannot use those ideas, you may use RTTI. But think twice about it. :- ) Then think twice again.
スマートポインタ(おさらい) • deleteを呼ばなくてもスコープから外れたら削除 してくれるようにするオブジェクトポインタのラッ パー • 標準のstd::auto_ptr • boostのboost::shared_ptr (参照カウント)
• C++11からはshared_ptrがstdに
template<class T> class smart_ptr { public: smart_ptr(): ptr(0) {} smart_ptr(T*
ptr): ptr(ptr) {} ~smart_ptr() { delete ptr; } T& operator*() const { return *ptr; } T* operator->() const { return ptr; } private: T* ptr; }; template<class T> smart_ptr<T> smartptr(T *p) { smart_ptr<T> ptr = smart_ptr<T>(p); return ptr; }
スマートポインタ(参照カウント)の作り方 • の前に...
参照カウント(Reference Counted)とは $a = "foo"; // refcount=1 • $b =
$a; // refcount=2 • $c = $a; // refcount=3 • unset($c); // refcount=2 • unset($b); // refcount=1 • unset($a); // refcount=0 -> 値破棄
参照カウントとは - その2 • シンプルかつ高速なGC機構 • すぐ破棄される • 様々な言語で使われている •
Perl, PHP, Pythonなど(RubyはM&S) • 循環に弱い ◦ $a->b = $a; $b->a = $a;
template <class T> class Ptr { T *p; int *cnt;
public: Ptr(T *p) : p(p) { cnt = new int(1); cout << "count=" << *cnt << endl; } Ptr(const Ptr<T> &self) { p = self.p; cnt = self.cnt; (*cnt)++; cout << "count=" << *cnt << endl; } ~Ptr() { (*cnt)--; cout << "count=" << *cnt << endl; if (*cnt < 1) { delete p; delete cnt; cout << "delete!" << endl; } } T *ptr() { return p; } };
template <class T> Ptr<T> foo(T *p) { cout << "in
foo()" << endl; Ptr<T> ptr = Ptr<T>(p); cout << "out foo()" << endl; return ptr; } int main() { { cout << "in loop1" << endl; Ptr<int> p1 = foo<int>(new int(100)); cout << *p1.ptr() << endl; { cout << "in loop2" << endl; Ptr<int> p2 = p1; cout << *p2.ptr() << endl; cout << "out loop2" << endl; } cout << "out loop1" << endl; } return 0; }
次回予告 • Database in depth