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
66
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.
27新卒_Webエンジニア職採用_会社説明資料
livesense
PRO
0
62
株式会社リブセンス・転職会議 採用候補者様向け資料
livesense
PRO
0
13
株式会社リブセンス 会社説明資料(報道関係者様向け)
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
asken AI勉強会(Android)
tadashi_sato
0
110
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
26k
2年でここまで成長!AWSで育てたAI Slack botの軌跡
iwamot
PRO
4
810
AI導入の理想と現実~コストと浸透〜
oprstchn
0
120
Lambda Web Adapterについて自分なりに理解してみた
smt7174
5
130
解析の定理証明実践@Lean 4
dec9ue
1
180
自律的なスケーリング手法FASTにおけるVPoEとしてのアカウンタビリティ / dev-productivity-con-2025
yoshikiiida
0
150
GitHub Copilot の概要
tomokusaba
1
140
20250625 Snowflake Summit 2025活用事例 レポート / Nowcast Snowflake Summit 2025 Case Study Report
kkuv
1
340
Github Copilot エージェントモードで試してみた
ochtum
0
110
SalesforceArchitectGroupOsaka#20_CNX'25_Report
atomica7sei
0
250
LangSmith×Webhook連携で実現するプロンプトドリブンCI/CD
sergicalsix
1
130
Featured
See All Featured
Making Projects Easy
brettharned
116
6.3k
Become a Pro
speakerdeck
PRO
28
5.4k
KATA
mclloyd
30
14k
Typedesign – Prime Four
hannesfritz
42
2.7k
GitHub's CSS Performance
jonrohan
1031
460k
Building Applications with DynamoDB
mza
95
6.5k
Site-Speed That Sticks
csswizardry
10
670
Code Reviewing Like a Champion
maltzj
524
40k
Side Projects
sachag
455
42k
Fireside Chat
paigeccino
37
3.5k
Being A Developer After 40
akosma
90
590k
Faster Mobile Websites
deanohume
307
31k
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