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
27
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.
株式会社リブセンス 会社説明資料(報道関係者様向け)
livesense
PRO
0
1.1k
データ基盤の負債解消のためのリプレイス
livesense
PRO
0
260
26新卒_総合職採用_会社説明資料
livesense
PRO
0
4.6k
株式会社リブセンス会社紹介資料 / Invent the next common.
livesense
PRO
1
13k
26新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
1
8.2k
中途セールス職_会社説明資料
livesense
PRO
0
200
EM候補者向け転職会議説明資料
livesense
PRO
0
87
コロナで失われたノベルティ作成ノウハウを復活させた話
livesense
PRO
0
210
転職会議でGPT-3を活用した企業口コミ要約機能をリリースした話
livesense
PRO
0
1.3k
Other Decks in Technology
See All in Technology
データエンジニアリング領域におけるDuckDBのユースケース
chanyou0311
9
2.4k
4th place solution Eedi - Mining Misconceptions in Mathematics
rist
0
150
いまからでも遅くない!コンテナでWebアプリを動かしてみよう!コンテナハンズオン編
nomu
0
170
IAMのマニアックな話2025
nrinetcom
PRO
6
1.3k
Amazon Q Developerの無料利用枠を使い倒してHello worldを表示させよう!
nrinetcom
PRO
2
120
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.7k
LINE NEWSにおけるバックエンド開発
lycorptech_jp
PRO
0
320
Apache Iceberg Case Study in LY Corporation
lycorptech_jp
PRO
0
350
目標と時間軸 〜ベイビーステップでケイパビリティを高めよう〜
kakehashi
PRO
8
760
手を動かしてレベルアップしよう!
maruto
0
240
偏光画像処理ライブラリを作った話
elerac
1
180
Share my, our lessons from the road to re:Invent
naospon
0
150
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
10
520
What's in a price? How to price your products and services
michaelherold
244
12k
The World Runs on Bad Software
bkeepers
PRO
67
11k
Documentation Writing (for coders)
carmenintech
67
4.6k
A designer walks into a library…
pauljervisheath
205
24k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Unsuck your backbone
ammeep
669
57k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
A Philosophy of Restraint
colly
203
16k
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