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
58
C++ FAQ #TechLunch
2012/01/25(水) @ Livesense TechLunch
発表者:桂 大介
Livesense Inc.
PRO
April 23, 2014
Tweet
Share
More Decks by Livesense Inc.
See All by Livesense Inc.
EM候補者向け転職会議説明資料
livesense
PRO
0
6
コロナで失われたノベルティ作成ノウハウを復活させた話
livesense
PRO
0
73
株式会社リブセンス 会社説明資料(報道関係者様向け)
livesense
PRO
0
360
転職会議でGPT-3を活用した企業口コミ要約機能をリリースした話
livesense
PRO
0
1k
株式会社リブセンス マッハバイト_プレイブック
livesense
PRO
0
410
Tech Award 2021 選出方法
livesense
PRO
0
1k
株式会社リブセンス エンジニアリング組織を支える風土と制度
livesense
PRO
0
530
株式会社リブセンス・マッハバイト 採用候補者様向け資料
livesense
PRO
0
210
株式会社リブセンス・転職会議 採用候補者様向け資料
livesense
PRO
0
2k
Other Decks in Technology
See All in Technology
サーバー間 GraphQL と webmock-graphql の話 / server-to-server graphql and webmock-graphql
qsona
2
190
AOAI をきっかけに 社内の Azure 管理を見直した話
recruitengineers
PRO
1
290
Delivering Millions of Messages within seconds @ Duolingo
pelelgrino
0
350
Azure犬駆動開発の記録/GlobalAzureFukuoka2024_20240420
nina01
1
210
Além do else! Categorizando Pokemóns com Pattern Matching no JavaScript
wmsbill
0
620
Reducing Cross-Zone Egress at Spotify with Custom gRPC Load Balancing Recap
koh_naga
0
200
反実仮想機械学習とは何か
usaito
PRO
11
4.6k
web-application-security
matsuihidetoshi
0
170
require(ESM)とECMAScript仕様
uhyo
3
670
IaCジェネレーターとBedrockで詳細設計書を生成してみた
tsukasa_ishimaru
1
180
LangSmith入門―トレース/評価/プロンプト管理などを担うLLMアプリ開発プラットフォーム
os1ma
3
160
オーナーシップを持つ領域を明確にする
konifar
13
3.2k
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
221
21k
Faster Mobile Websites
deanohume
299
30k
5 minutes of I Can Smell Your CMS
philhawksworth
199
19k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
9
8.3k
jQuery: Nuts, Bolts and Bling
dougneiner
59
7.1k
Building Applications with DynamoDB
mza
88
5.6k
The Cult of Friendly URLs
andyhume
74
5.7k
Ruby is Unlike a Banana
tanoku
96
10k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
501
140k
In The Pink: A Labor of Love
frogandcode
138
21k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
Transcript
C++ FAQ
[email protected]
ポインタとは何か • (1)メモリ内で型指定されたオブジェクトを識別す るために使用される値(アドレス)。 • (2)そのような値を保持する変数。
リファレンス(参照)とは何か • (1)型指定された値のメモリ内での位置を示す 値 • (2)そうした値を保持する変数 • int& m =
n; • 結合変えはできない
なぜ違う型のポインタは代入出来ないか • int*とchar*は両方ともアドレス値であるのに代 入時にエラーになるのはなぜか • サイズが違うときに他の領域への上書きが起 こってしまうから。int = doubleはキャストが起こ るため可能だが、*int
= *doubleは不可。 • ただし reinterpret_cast を使用すれば可能。
メモリレイアウトはどうなっているのか • コード用のコードストレージ(テキストストレージ) • グローバル変数用の静的ストレージ • 関数の引数とローカル変数のためのスタック。 動的領域に比べて速い。 • 動的その1。new/deleteで操作するフリースト
ア。 • 動的その2。malloc/freeで操作するヒープ。
new演算子とは何か • フリーストアからメモリを確保し、コンストラクタ の呼び出しによってオブジェクトを作成し、その ポインタ(T*)を返す。 • 複数のオブジェクト(配列)を作成した場合は、最 初のオブジェクトへのポインタを返す。
delete演算子とは何か • delete演算子はnew演算子によって割り当てら れたメモリをフリーストアに返す。 • 解放済みのポインタに対してのdelete(double free)はエラーになる。 • nullポインタはdouble freeしても害はない。
• どちらにせよアプリケーション終了時にはOSに 全て返される。
newとdeleteにおける注意点 • new演算子はコンストラクタの中だけで使用し、 delete演算子はデストラクタの中だけで使用す ると良い
nullポインタとは何か • ポインタに代入される0の値 • C言語だと(void*)0だが、C++では0 • 実装として「アドレスが0」である必要はない • オーバーロードがbuggy
void* とは何か • コンパイラが型を知らないメモリへのポインタ • 型を知らないコード間でアドレスをやりとりした いときに使用 • コールバック関数のアドレス引数や、最も低いレ ベルのメモリ割り当て(new演算子の実装)など
• C++ではvoid*からT*への暗黙的な変換は無効
C++11のnullptrとは何か • nullポインタを指定するためにのみ予約された 新たなキーワード • あらゆるポインタ型との比較・代入ができる
static_castとは何か • void*から特定の型へのキャストを行う • void* n = new int(1); •
int* m = static_cast<int*>(n)
reinterpret_castとは何か • intとdouble*など関連のない型の間での変換を 可能にする • int a = 3; •
double* b = new double(4.4); • a = reinterpret_cast<int>(b);
const_castとは何か • constをキャストによって取り去る • const int* n = new int(5);
• int* m = const_cast<int*>(n); • ++*m;
スマートポインタとは何か • deleteを呼ばなくてもスコープから外れたら削除 してくれるようにするオブジェクトポインタのラッ パー • 標準のstd::auto_ptr • boostのboost::shared_ptr (参照カウント)
• C++11からはshared_ptrがstdに
ジェネリックプログラミングとは何か • テンプレートを使用すること • 引数として表されるさまざまな型に対応するコー ドを記述すること。ただし、それらの引数型が特 定の構文上および意味的な要件を満たすこと が前提となる。 • パラメータポリモルフィズム(OOPのはアドホック
ポリモルフィズム)
ジェネリックとオブジェクト指向の対比 • ジェネリックプログラミングはテンプレートによっ てサポートされ、コンパイル時の決定に依存す る • オブジェクト指向プログラミングはクラス階層と 仮想関数によってサポートされ、実行時の決定 に依存する
クラスとは • オブジェクトの表現と、それらのオブジェクトで許 可される操作を定義するための型
クラスはどこから来たか • Simula
private継承とは何か • class Foo : private BaseFoo • 基底クラスのすべてのメソッドはprivateになる •
型変換は行われない • is-implemented-in-terms-of関係 • 実装継承 • 殆どの場合、コンポジションを使うべき
virtual function(仮想関数)とは何か • オーバーライドされ得る関数 • SimulaのINSPECT文(instanceof)をStroustrup はわざとC++に導入しなかった
関数ポインタとは何か • 関数のエントリポイント(アドレス値)を保持した 変数 • 受け渡しが可能
関数オブジェクトとは何か • ()演算子をオーバーロードしたオブジェクト • 関数みたいに呼び出せる • ファンクタ(functor)とも言う
多重継承(MI) • 「多重継承をRelease2.0に加えたことは間違い だった(もっと優先すべきがあった)」 Stroustrup • 「多重継承は脱出用パラシュートである。ふだん は要らないが必要なときには不可欠だ」 Booch •
「どのくらすがどのくらすのきのうをりようしてい るのかわかりにくくなる」 Matz
例外処理の目標 • リターンの仕組みの一種ではなくて、障害許容 システムの構築をサポートするための仕組みで ある。 • すべての関数を障害許容にするものではなく、 個々の関数に充実したエラー処理の機能を装 備させていない場合でも、サブシステムに良質 な障害許容性を与える仕組みである。
• たった一つの"正しい"エラー処理へアプリケー ションの設計者を縛り付けるのではなく、言葉を より表現力豊かにするための仕組みである。
例外はthrow地点から再開出来るべきか pros • 再開は終了を含んでいる(より一般的) • リソース不足のときなどに有用 cons • 終了の方がシンプル •
ライブラリとユーザーの密結合を招く
STLとは何か • Standard Template Library • アレクサンドル・ステパノフが作成 • Templateを使ったコンテナ・イテレータ・アルゴ リズムの集合
• vectorとかlistとかsetとかmapとか
boostとは何か • モダンなライブラリ • C++11に多数採用される • lambda, regex, shared_ptr, foreachなど
• 変わった所ではtribool, optional, anyなど
次回は? C++11 FAQ