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
75
株式会社リブセンス・転職会議 採用候補者様向け資料
livesense
PRO
0
14
株式会社リブセンス 会社説明資料(報道関係者様向け)
livesense
PRO
0
1.4k
データ基盤の負債解消のためのリプレイス
livesense
PRO
0
390
26新卒_総合職採用_会社説明資料
livesense
PRO
0
8.8k
株式会社リブセンス会社紹介資料 / Invent the next common.
livesense
PRO
1
27k
26新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
1
12k
中途セールス職_会社説明資料
livesense
PRO
0
250
EM候補者向け転職会議説明資料
livesense
PRO
0
120
Other Decks in Technology
See All in Technology
AWS Summit Japan 2025 Community Stage - App workflow automation by AWS Step Functions
matsuihidetoshi
1
300
LangChain Interrupt & LangChain Ambassadors meetingレポート
os1ma
2
180
強化されたAmazon Location Serviceによる新機能と開発者体験
dayjournal
3
230
Tech-Verse 2025 Global CTO Session
lycorptech_jp
PRO
0
1k
Tech-Verse 2025 Keynote
lycorptech_jp
PRO
0
1.1k
2025-06-26_Lightning_Talk_for_Lightning_Talks
_hashimo2
2
110
Fabric + Databricks 2025.6 の最新情報ピックアップ
ryomaru0825
1
150
生成AI活用の組織格差を解消する 〜ビジネス職のCursor導入が開発効率に与えた好循環〜 / Closing the Organizational Gap in AI Adoption
upamune
5
4.4k
Node-REDのFunctionノードでMCPサーバーの実装を試してみた / Node-RED × MCP 勉強会 vol.1
you
PRO
0
120
変化する開発、進化する体系時代に適応するソフトウェアエンジニアの知識と考え方(JaSST'25 Kansai)
mizunori
1
260
AIとともに進化するエンジニアリング / Engineering-Evolving-with-AI_final.pdf
lycorptech_jp
PRO
0
140
2025-06-26 GitHub CopilotとAI駆動開発:実践と導入のリアル
fl_kawachi
1
200
Featured
See All Featured
Practical Orchestrator
shlominoach
188
11k
The Invisible Side of Design
smashingmag
300
51k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Stop Working from a Prison Cell
hatefulcrawdad
270
20k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
124
52k
Unsuck your backbone
ammeep
671
58k
The Cost Of JavaScript in 2023
addyosmani
51
8.5k
GraphQLとの向き合い方2022年版
quramy
49
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