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新卒_総合職採用_会社説明資料
livesense
PRO
0
390
27新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
0
3.9k
株式会社リブセンス・転職会議 採用候補者様向け資料
livesense
PRO
0
85
株式会社リブセンス 会社説明資料(報道関係者様向け)
livesense
PRO
0
1.6k
データ基盤の負債解消のためのリプレイス
livesense
PRO
0
480
26新卒_総合職採用_会社説明資料
livesense
PRO
0
12k
株式会社リブセンス会社紹介資料 / Invent the next common.
livesense
PRO
1
43k
26新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
1
13k
中途セールス職_会社説明資料
livesense
PRO
0
270
Other Decks in Technology
See All in Technology
今から間に合う re:Invent 準備グッズと現地の地図、その他ラスベガスを周る際の Tips/reinvent-preparation-guide
emiki
1
210
「タコピーの原罪」から学ぶ間違った”支援” / the bad support of Takopii
piyonakajima
0
160
20251027_マルチエージェントとは
almondo_event
1
500
様々なファイルシステム
sat
PRO
0
280
251029 JAWS-UG AI/ML 退屈なことはQDevにやらせよう
otakensh
0
120
RemoteFunctionを使ったコロケーション
mkazutaka
1
170
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
2
210
AIとの協業で実現!レガシーコードをKotlinらしく生まれ変わらせる実践ガイド
zozotech
PRO
2
240
Open Table Format (OTF) が必要になった背景とその機能 (2025.10.28)
simosako
3
580
パフォーマンスチューニングのために普段からできること/Performance Tuning: Daily Practices
fujiwara3
2
180
20251029_Cursor Meetup Tokyo #02_MK_「あなたのAI、私のシェル」 - プロンプトインジェクションによるエージェントのハイジャック
mk0721
PRO
6
2.2k
設計に疎いエンジニアでも始めやすいアーキテクチャドキュメント
phaya72
22
14k
Featured
See All Featured
It's Worth the Effort
3n
187
28k
Gamification - CAS2011
davidbonilla
81
5.5k
GitHub's CSS Performance
jonrohan
1032
470k
For a Future-Friendly Web
brad_frost
180
10k
Navigating Team Friction
lara
190
15k
Six Lessons from altMBA
skipperchong
29
4k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6k
Building Applications with DynamoDB
mza
96
6.7k
Docker and Python
trallard
46
3.6k
Producing Creativity
orderedlist
PRO
348
40k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
2.9k
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