SlideShare a Scribd company logo
1 of 48
Download to read offline
C2C++11 〜Level 1 〜
安全なコードを求めて
株式会社ムラサメ研究所
みやたけ ゆき
自己紹介
みやたけゆき
 主な開発言語 C++、アセンブラ、GPGPU、シェー
ダー、Java、スマホネイティブ
 最近のC++開発案件
MOゲームサーバ(boost.asio)
3Dゲームエンジンfor iOS&Android(OpenGLES2.0)
動画エンコーディング(h264)
3Dレンダリングエンジンfor Windowd(DirectX11)
セキュリティーソフト for Windows
ゲーム(cocos2d-x)、UNITY用 C++プラグイン
ゲーム(コンシュマー)
 C++11歴は 5ヶ月。それまでは生ポインターと
memcpyを愛用
題字(花文字)
睦月 翔子
花文字アーティスト
花文字とは、龍や鳥等の開運絵柄を用い
て即興で描く文字です。オーダーメイド
の開運アイテムとして人気がございます。
http://hana-moji.jp/
はじめに
 C言語は最も利用されている言語だが、メモリ
やポインタ等を抽象化せずに直接使用してき
たため、それらの不具合やセキュリティ問題
が多い
 C++では、速度を損なわずに それらを抽象化
し、安全で高速なコードを提供する
 今回はLevel1 という事で、危険性の高いポイ
ンタやメモリを中心に、C++の安全なコード
に変更する方法を書く
 今回のメインターゲットは、C言語に満足して、
C++11に移行出来てない人、具体的には生ポ
インタやmemcpyを書いている技術者
ポインタ
過去の問題
 過去において、各社が独自にスマートポインタを作っ
ていた
 各社インタフェースが違い習得コストが高い
 それぞれにに癖があり、むしろ余計にメモリリークを
していた事も・・
お前は今までにprintfしたCComPtrの参照カウンタの
数を覚えているか?
 スレッドセーフでないもの、オーバーヘッドの大きい
もの等があった
 auto_ptrには問題がある、boostライブラリは導入が
大変だ
標準化されたので安心して使いましょう!!
問題
 C言語でよく難しいと言われる代表が
ポインタ
 C言語で不具合が最もいものが
ポインタ
下記のコードは問題がある。何故?
char *p = new char[10];
・・・何かの処理
delete[] p;
答え
char *p = new char[10];
・・ここで例外発生したらpが開放されない
delete[] p;
このような過ちは熟練者でもよくやってしま
う。
生ポインタは使うべきではない
unique_ptr
先ほどの例は unique_ptrを使うと
unique_ptr<char[]> p(new char[10]);
・・・何かの処理
これでOK。スコープを抜けると デストラクタで処
理されるので 明示的にdeleteする必要もないし
例外発生時も正しく デストラクタが開放してくれる
ポインタはunique_ptrに置き換えるべき
unique_ptr
 unique_ptrでラップしたポインタは、普
通のポインタのように扱う事が出来る
 生ポインタと実行速度は変わらない
 互換性等の為に、生のポインタが欲しい場
合はp.get() で取得できる
 release()メソッドを呼べば、ポインタと
の関係性を破棄(unique_ptrのスコープ
が消えてもdeleteされない)
従来のポインタとの互換性も十分
おまけ
 C++14では make_uniqueが追加された
unique_ptr<char[]> =
make_unique<char[]>(20); // 配列数を指定
newが不要になった
newに対応したdeleteがないと気持ち悪い人に朗報
 カスタムデーリータを設定する事が出来る
例えばファイルハンドルがスコープ外に出たらcloseするとか
 参照カウンタをもったポインタは
shared_ptr&weak_ptrを使う
ポインタは全て、スマートポインタに変えるべき
配列
宣言
C言語では配列は
int a[10];
C++では
std::array<int,10> ar;
二次元配列
int aa[10][2];
std::array<std::array<int,2>, 10> aar;
配列の順番が逆になる事に注意
配列の順番が逆になる のが気になる人は
Sprout とか使うといいらしいよ
概要
std::array<int,10> ar;
ar[1] = 10;
普通の配列と同じように使える
中身は配列なのでオーバーヘッド無し
宣言は多少面倒だが
std::arrayを使いましょう
std::arrayを使うメリット
 配列数を取得
std::array
ar.size()
生配列
sizeof(a)/sizeof(*a)
あるいは
std::size(a)
簡潔でわかりやすい
std::arrayを使うメリット
 アルゴリズム
std::array
ar.fill(5);
生配列
std::fill(std::begin(a), std::end(a), 5);
簡潔でわかりやすい
std::arrayを使うメリット
 比較
std::array
if( ar1 == ar2 )
生配列
if( std::equal(std::begin(a1),
std::end(a1), std::begin(a2)))
簡潔でわかりやすい
std::arrayを使うメリット
 範囲外アクセス
std::array
ar.at(100); // throw std::out_of_range
ar[100]; // 不正アクセス
生配列
a [100]; // 不正アクセス
atを使うと範囲外アクセスで例外発生
std::arrayを使うメリット
 型の安全性
std::array
void hoge(std::array<int,5> &a) // int 5個配列以外
はコンパイルエラー
生配列
void hoge(int *a) // どんなサイズでもOKになるので、
安全でない
void hoge(int (&a)[5]) // int 5個配列以外はコンパイ
ルエラー
生配列の文法はわかりにくい
まとめ
 実はC++11になると、生配列も機能
拡張され、stl::algorithm を使えば、
std::arrayとほぼ同じ事が出来る
 だが、std::arrayを使う方がコード
も読みやすいしデメリットはないの
で積極的に使うべき
おまけ
 C++17では std::make_arrayが提案されている
std::array<int,4> a{{0,1,2,3}};
が std::make_arrayを使うと
auto a(std::make_array(0,1,2,3));
と書け、要素数や型を指定しなくてもよくなる
https://gist.github.com/lichray/6034753
ここに実装例があるので、上記のコードを参考にすれば
C++11でも std::make_arrayを使用する事が可能
使ってますが とっても便利です!
memcpy
memcpy
 memcpyは最も危険な関数の一つ。
memcpyによるバッファオーバーラ
ンで苦しんだCゲンガーは多い
 memcpyは原始的で、型も無視し機
械的にメモリをコピーする
 C++ではmemcpyを極力使わず
std::copyや代入演算子等の安全なも
のを使うべきだ
構造体のコピー
struct A{
int a[10]:
}a;
struct B{
int a[100]:
}b;
memcpy( a, b, sizeof(B) );
当然 バッファオーバーラン!!
構造体のコピーは単純に
a=b;
と、代入演算子を使いましょう
当然、この場合は型が違うのでコンパイルエラー
型が同じであれば当然コピー出来ます
配列のコピー
int a[10],b[100];
memcpy( a, b, sizeof(b) );
当然バッファオーバーランします
配列は std::arrayを使うんでしたね
std::array<int,10> a;
std::array<int,100> b;
a=b;
代入演算子を使いましょう
当然、この場合は型が違うのでコンパイルエラー
同じ型であれば当然コピー出来ます
配列の一部コピー
int a[10],b[100];
memcpy( a+2, b+2, sizeof(int)*10 );
当然バッファオーバーランします
std::array<int,10> a;
std::array<int,100> b;
std::copy(std::begin(b)+2, std::begin(b)+12,
std::begin(a)+2);
ダメです。メモリリークします
std::copyを使っても安心できません
ただし、Clangだと上記のコードで aの範囲
チェックされているようで、リークしません!!
Clangすばらしい!
まとめ
 構造体のコピーは代入で
 配列はarrayを使えば代入でOK
 途中のコピーはstd::copyで。ただし、
バッファオーバーランには気をつけて
ね
 std::copyはstlコンテナ(vector等)とも
相性が良いのでそちらを使うべき
 どうしても原始配列を使う場合も、フ
リー関数を使えばSTLアルゴリズムを使
える
おまけ 速度比較
 memcpyは連続領域を一括コピーする
一般的には、レジスタの最大サイズでコ
ピーを行うため高速である
 代入やstd::copyでは基本1要素毎のコピー
であるため、速度はmemcpyより遅い事も
ある
 しかし構造体には アラインがあり、
memcpyはアラインまでコピーする為、場
合によっては 代入のほうが速い
速度差が顕著な場合を除いて、危険な
memcpyを使うべきではない
cast
cast
 C言語のcastは1種類で、意図しない
castをする可能性がある
 C++には const_cast、static_cast、
dynamic_cast、reinterpret_cast
の4つがあり、それぞれに何を意図し
たcastかを指定出来る
const_cast
 constとvolatileを外すcast
void a(const int&n){
const_cast<int&>(n)=5;
}
こんな事書くと constで渡してるのに値を書き換えられてしまう!!
よっぽどな事が無い限り使ってはいけない非常に危険なcast
個人的にはvolatileの制御で時々使うがマニア向け
volatile int flag; // flagは最適化対象外になる
int *p = const_cast<int*>(&flag); // pは最適化対象
参考:
http://qiita.com/YukiMiyatake/items/1191ab03b6c0b5a22876
最も使ってはならないcast
dynamic_cast
 実行時にキャストが行われる
class A{virtual void boo(){};};
class B : public A{};
class C{virtual void boo(){};};
B bb;
A *a = dynamic_cast<A*>(&bb);
B *b = dynamic_cast<B*>(a);
C *c = dynamic_cast<C*>(a);
B*からA*へのアップキャストは安全
A*からB*へのダウンキャストは危険をともなう場合がある
A*からC*は継承関係がないのでエラー値 nullが返って来る
なるべく使わないcast
static_cast
 コンパイル時に決定されるキャスト
double d = static_cast<double>(3) / 2;
コンパイル時に確定される、非常に安全な
キャスト
暗黙的な変換等あるいは
void*からの変換を行う
どんどん使ってよろしい cast
reinterpret_cast
 最解釈キャスト
float f = 1.0f;
int f0 = *(reinterpret_cast<int*>(&f));
強制的になんでもキャストする(型を無視)
上記は f0には 1ではなく、そのCPUの浮動小数1.0fのバ
イトデータが入る
(ex 0x3f800000)
継承関係があってもアップキャスト、ダウンキャスト等
を行わない
最も不具合を出す危険なcast
まとめ
 C++で追加された4つのキャストを使う事
 static_cast以外を使う時は、設計ミスをし
ている可能性を疑おう
 実行時エラーが起きた際に キーワードで検
索で絞れる
C++スタイルのキャストを使っていると不
具合も探しやすい
 他人がソースを読む場合に意図が伝わる
つまり、C++のキャストを使うべき
explicit
explicit
 引数1つのコンストラクタ=型変換コ
ンストラクタ
が存在する場合は、暗黙的型変換が
行われるので、それを阻止する事が
できる
explicit
class A{
public:
A( int n ){cout << "construct " << n << endl; };
};
auto main() -> int {
[](const A &a){}(2);
return 1;
};
const A& の引数を期待しているが intで渡せる
暗黙的型変換により intから class Aが 暗黙的に生成されている!!
一般的には、明示的な型変換しか受け付けないほうが良い
暗黙的型変換を想定していない場合は 禁止すべきだ
explicit
class A{
public:
explicit A( int n ){};
};
と、explicitを使えば暗黙的型変換はコンパイルエ
ラーになる
もちろん、明示的にキャストすればOK
[](const A &a){}(static_cast<A>(2));
特別な意図がないかぎりは、型変換コンストラク
タは explicitするべき
型エイリアス
型エイリアス
 今までは typedefを使い型を定義し
ていたが、型が一番右に来て直感的
に分かりにくい
 また、関数や配列の場合は一番右で
もなく真ん中に来るので更にわかり
にくい
 typedefではテンプレートを使えない
 using 型 = ほげ;
と、直感的に分かりやすく書ける!
型エイリアス
// typedef
typedef int hoge1;
typedef int hoge2[10];
typedef hoge1 (*hoge3)(hoge2);
// 型エイリアス
using hoge1 = int;
using hoge2 = int[10];
using hoge3 = hoge1(*)(hoge2);
どちらも同じ動作をするが、明らかに型エイ
リアスのほうが可読性が高い
template
// typedef
template<class T>
typedef std::map<int, T> int_map;
int_map<double> m;
// コンパイルエラー
// 型エイリアス
template<class T>
using int_map= std::map<int, T>;
int_map<double> m;
// OK
typedefでは テンプレートに対応出来ない
enum class
enum class
 基本は enum
 enum classはスコープがついている
ので名前がかぶらなくなった
 内部型のデフォルトが処理系依存で
なくなった
 intへの暗黙的キャストがなくなり安
全性が増した
スコープ
int A;
enum hoge{
A, // int Aとシンボルがぶつかりエラー
B
};
enum class hoge2{
A, // スコープを持つのでかぶらない
B
};
以前のenumは、スコープを持たないため、他のシンボ
ルとかぶる為、namespaceを付けたり、サフィックスを
つけてたが
enum classでは独自スコープを持つため 問題ない
暗黙的型変換
enum class hoge {
A, B
};
int a = hoge::A; // コンパイルエラー
enumではintへの暗黙的型変換は許可されているが
enum class では許可されない
static_castで内部型に明示的にキャストする
// enum classの内部型
using hoge_t = std::underlying_type<hoge>::type ;
hoge_t a = static_cast<hoge_t>(hoge::A);
最後に
 C++11の機能を使うにあたって、まず
は安全なコードを意識しましょう
 生ポインタはスマートポインタに変更
 配列は std::arrayを使用する
 memcpyの使用を避ける
 castはC++のキャストを使う
 typedefより 型エイリアスを使う
 列挙は enum classを使う

More Related Content

What's hot

Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3DKouji Hosoda
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)MITSUNARI Shigeo
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Mr. Vengineer
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
基礎からのCode Contracts
基礎からのCode Contracts基礎からのCode Contracts
基礎からのCode ContractsYoshifumi Kawai
 
UniRxことはじめ
UniRxことはじめUniRxことはじめ
UniRxことはじめShoichi Yasui
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Yuto Takei
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」直久 住川
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutinemelpon
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Takaaki Suzuki
 

What's hot (20)

Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
基礎からのCode Contracts
基礎からのCode Contracts基礎からのCode Contracts
基礎からのCode Contracts
 
UniRxことはじめ
UniRxことはじめUniRxことはじめ
UniRxことはじめ
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
コルーチンの使い方
コルーチンの使い方コルーチンの使い方
コルーチンの使い方
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 
Misrac20150523
Misrac20150523Misrac20150523
Misrac20150523
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7
 

Viewers also liked

おそらく明日から役にたつC++11新機能
おそらく明日から役にたつC++11新機能おそらく明日から役にたつC++11新機能
おそらく明日から役にたつC++11新機能Kenta IDA
 
面接時における心構えとマナー 荒谷 朋哉
面接時における心構えとマナー 荒谷 朋哉面接時における心構えとマナー 荒谷 朋哉
面接時における心構えとマナー 荒谷 朋哉mourikousuke
 
ゲーム開発経営ゲーム
ゲーム開発経営ゲームゲーム開発経営ゲーム
ゲーム開発経営ゲームYuki Miyatake
 
センパイ!このプログラムクラッシュするんですけど。。。
センパイ!このプログラムクラッシュするんですけど。。。センパイ!このプログラムクラッシュするんですけど。。。
センパイ!このプログラムクラッシュするんですけど。。。yjono Seino
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料Ryo Igarashi
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 

Viewers also liked (7)

おそらく明日から役にたつC++11新機能
おそらく明日から役にたつC++11新機能おそらく明日から役にたつC++11新機能
おそらく明日から役にたつC++11新機能
 
面接時における心構えとマナー 荒谷 朋哉
面接時における心構えとマナー 荒谷 朋哉面接時における心構えとマナー 荒谷 朋哉
面接時における心構えとマナー 荒谷 朋哉
 
ゲーム開発経営ゲーム
ゲーム開発経営ゲームゲーム開発経営ゲーム
ゲーム開発経営ゲーム
 
センパイ!このプログラムクラッシュするんですけど。。。
センパイ!このプログラムクラッシュするんですけど。。。センパイ!このプログラムクラッシュするんですけど。。。
センパイ!このプログラムクラッシュするんですけど。。。
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 

Similar to C2C++11Level1

ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネルももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネルTakashi Yoshinaga
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けてonotchi_
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Ryo Suzuki
 
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門Kohki Miki
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
ソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグToru Tamaki
 
Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!Tomoaki Shimizu
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携Tomoaki Shimizu
 
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013Kiyoshi Ogawa
 
1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法NVIDIA Japan
 
ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装dena_study
 
cocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツールcocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツールTomoaki Shimizu
 

Similar to C2C++11Level1 (14)

ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネルももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けて
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発
 
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
ソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグ
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
 
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
 
1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法
 
ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装
 
cocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツールcocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツール
 

Recently uploaded

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 

Recently uploaded (7)

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 

C2C++11Level1