SlideShare une entreprise Scribd logo
1  sur  13
N3495 inplace realloc
2013/12/14 13:30 to 18:00 に開催された、C++14勉強会 http://atnd.org/events/45289
での発表内容に、その後のフォローアップ内容を追記

SC22WG21 エキスパート
近藤 貴俊
(株式会社 オージス総研)

2014/1/30

1
N3495

提案概要
• 提案者
– Ariane van der Steldt ariane@stack.nl

• 提案日
– 2012-12-07

• std::allocator_traits にC言語のreallocのよう
に
アロケート済みメモリのリサイズが可能
な
インターフェースを追加しようという提
案

2014/1/30

2
N3495

IV

提案インターフェース

2014/1/30

template<typename Alloc>
class std::allocator_traits {
public:
リサイズしたいメモリのポインタ
... /* Existing definition. */
static pointer
alloc_resize(Alloc& a, pointer p, size_type n_cur, size_type n_new)
{
現在の(変更前の)サイズ
変更後のサイズ
/*
* p, having n_cur elements,
reallocのようにメモリの移動は行わない
* would change to having n_new elements.
* If the allocator does not support this,
* std::bad_alloc() is thrown.
要素を増やすことができない場合は、
std::bad_alloc()をthrow
*
* (p, n_cur) must refer to a previous allocation,
* or the behaviour is undefined.
前回の確保に対応していないのを渡したら
*
undefined behavior
* This function is implemented as:
* a.alloc_resize(p, n_cur, n_new) iff implemented by Alloc,
* or as
* throw std::bad_alloc() otherwise.
*/
return p;
実装されていない場合はstd::bad_alloc()をthrow
}
};
3
IV

N3495

標準ライブラリの変更
• 全ての連続したストレージを持つコンテ
ナにおいて、allocateしてからmoveする箇
所があればその前に、alloc_resizeの処理を
追加する。

2014/1/30

4
V

N3495

失敗時にbad_allocを返すことについて
• mis-useの可能性を最小化する
– 例外なので戻り値チェック漏れがない

• アロケータの実装とメモリの使用状況に
よるが、極めて頻繁に例外発生パスを通
過し得る

2014/1/30

5
V

N3495

この機能の追加について
• マイクロソフトがheapの実装で類似の機能を
用いている
• reallocの、メモリの移動が発生しない場合の
挙動と同じsemanticsである
• O(n)の操作をO(1)にできる
• アロケータがresize_allocを提供しない場合、
bad_alloc()をthrowするため、追加の機能が必要と
コンテナでそれをcatchしてallocate - move する処理のことだと思われる
なる
しかし、良いコンパイラはinline展開を行い、
さらに、このthrowとcatchを取り除く最適化を行う
だ
try { throw std::bad_alloc(); } catch (std::bad_alloc const&) が無くなるということか?
ろう。
inline展開
光成さんの指摘、および、その後のML議論で、そのような最適化は現在行われていないことを確認
2014/1/30

https://groups.google.com/a/isocpp.org/forum/#!searchin/std-proposals/inplace/std-proposals/enjN4nBon4M/RIl4Rgh5bakJ

6
V

N3495

この機能の追加について
• Actually a big counter-argument, which I suspect is
the cause for this not being in the c++11 standard in
the first place:
– CON: exact semantics not supported by the C standard,
nor in new[]/delete[] operators, making an
implementation for std::allocator hard.

• C標準では、このsemacticsがサポートされていない
reallocで、メモリアドレスそのままで伸長できない場合、メモリの移動が発生してしま
う

• new[], delete[] でもリサイズはできない

• std::allocatorの実装が大変である
伸長できないとき、null ポインタを返すような、resizeみたいなものがあればいいのかな
後ほど、深掘りして議論する
2014/1/30

7
N3495

V

【参考】libsupc++ new_op.cc の実装
using std::new_handler;
using std::bad_alloc;
#if _GLIBCXX_HOSTED
using std::malloc;
#else

// A freestanding C runtime may not provide "malloc" -- but there is no
// other reasonable way to implement "operator new".
extern "C" void *malloc (std::size_t);
#endif

_GLIBCXX_WEAK_DEFINITION void *
operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc)
{
void *p;

/* malloc (0) is unpredictable; avoid it. */
if (sz == 0)
sz = 1;
p = (void *) malloc (sz);
while (p == 0)
{
new_handler handler = std::get_new_handler ();
if (! handler)
_GLIBCXX_THROW_OR_ABORT(bad_alloc());
handler ();
p = (void *) malloc (sz);
}
return p;
}
2014/1/30

8
V

N3495

名前候補
• realloc
– Cのライブラリ関数と同名で異なるセマンティックス
のため却下

• realloc_inplace
– 同上

• reallocate_inplace
– 名前が長すぎるので却下

• alloc_resize
– existing allocationをresizeするのでOK
振る舞いが提案の主題で、名前は2の次。良い名前Welcome
2014/1/30

9
N3495

V.1

サイズ拡張の成功率向上要因
• ASLR(Address Space Layout Randomization)
– 今時の多くのアロケータは、ASLRを用いてい
る
– この結果、アロケートされたメモリブロック
間に
「2つの並行して行われる」というのは、あまり関係ない気がする
隙間が生じやすい

• メモリの解放
– 2つの並行して行われるメモリアロケーション
において、確保済みメモリが解放されること
で、隙間が生じたり、拡がったりする。
2014/1/30

10
N3495

std::allocatorでalloc_resizeを実装
• Cとは全く別のアロケータ
– Cとの共存時、効率が悪いのでNG

• リサイズ可能かどうかを調べる、try_realloc
みたいな関数をどこかに追加
– reallocを呼ぶまでに状態が変わるのでNG

• リサイズ可能ならリサイズし、そうでなければ、
nullポインタを返すresize みたいな関数を
どこかに追加
– Cのreallocの前半処理みたいなイメージ
– よさげ?

2014/1/30

11
N3495

resizeをどこに追加する?
• C標準ライブラリ
– Cの規格改定に合わせて提案が必要
– Cユーザにメリットがあるか、不明
• C++では、move時にmemcpyでは困るという強い動機がある。

• C++標準ライブラリ
今回追加
– malloc, free, realloc との整合性が気になる 宣言済み
– namespace std { using malloc; using free; using realloc; resizeの定義; }
– resizeの実装を行うためには、C標準ライブラリの内部実装
(freelistとか)の知識が必要。同期してUpdateするなどメンテも必要。

• g++, clang++, VC++など全てCと合わせてリリースしているので問題は少ない?

– C++規格で、resizeの説明を記述するのが、大変そう
• mallocとかの詳細はC規格参照としつつ書けるかどうか。。。

2014/1/30

12
N3495

誤り指摘
• VI: Technical specifications XXX not the actual
wording in the final standard, mostly intended to
illustrate the proposed semantics. std::allocator
may or may not implement
std::allocator<T>::alloc_resize(pointer p, size_type
n_cur, size_type n_new). If the combination (p,
n_cur) does not reflect an existing allocation, an
std::invalid_argument exception will be thrown.
undefined behaviorの誤りだと思われる。
2014/1/30

13

Contenu connexe

Tendances

ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」Fujio Kojima
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたKazuyuki TAKASE
 
Scala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみたScala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみたKazuyuki TAKASE
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~Fujio Kojima
 
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
 
GC in C++0x
GC in C++0xGC in C++0x
GC in C++0xyak1ex
 
プログラミング技法特論第8回
プログラミング技法特論第8回プログラミング技法特論第8回
プログラミング技法特論第8回Noritada Shimizu
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくるデジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくるAtsushi Tadokoro
 
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
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話Moriyoshi Koizumi
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2sunaemon
 

Tendances (20)

ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
C++勉強会
C++勉強会C++勉強会
C++勉強会
 
Scala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみたScala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみた
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
GC in C++0x
GC in C++0xGC in C++0x
GC in C++0x
 
プログラミング技法特論第8回
プログラミング技法特論第8回プログラミング技法特論第8回
プログラミング技法特論第8回
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくるデジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
 
Boost17 cpplinq
Boost17 cpplinqBoost17 cpplinq
Boost17 cpplinq
 
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
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2
 

En vedette

Boostsapporomsmpre 111030054504-phpapp02
Boostsapporomsmpre 111030054504-phpapp02Boostsapporomsmpre 111030054504-phpapp02
Boostsapporomsmpre 111030054504-phpapp02Takatoshi Kondo
 
Effective Modern C++ study group Item39
Effective Modern C++ study group Item39Effective Modern C++ study group Item39
Effective Modern C++ study group Item39Takatoshi Kondo
 
Boostsapporomsmpost 111106070819-phpapp02
Boostsapporomsmpost 111106070819-phpapp02Boostsapporomsmpost 111106070819-phpapp02
Boostsapporomsmpost 111106070819-phpapp02Takatoshi Kondo
 
MessagePack(msgpack): Compact and Fast Serialization Library
MessagePack(msgpack): Compact and Fast Serialization LibraryMessagePack(msgpack): Compact and Fast Serialization Library
MessagePack(msgpack): Compact and Fast Serialization LibraryTakatoshi Kondo
 
Pub/Sub model, msm, and asio
Pub/Sub model, msm, and asioPub/Sub model, msm, and asio
Pub/Sub model, msm, and asioTakatoshi Kondo
 
CppCon2016 report and Boost.SML
CppCon2016 report and Boost.SMLCppCon2016 report and Boost.SML
CppCon2016 report and Boost.SMLTakatoshi Kondo
 

En vedette (9)

Boostsapporomsmpre 111030054504-phpapp02
Boostsapporomsmpre 111030054504-phpapp02Boostsapporomsmpre 111030054504-phpapp02
Boostsapporomsmpre 111030054504-phpapp02
 
Effective Modern C++ study group Item39
Effective Modern C++ study group Item39Effective Modern C++ study group Item39
Effective Modern C++ study group Item39
 
Boostsapporomsmpost 111106070819-phpapp02
Boostsapporomsmpost 111106070819-phpapp02Boostsapporomsmpost 111106070819-phpapp02
Boostsapporomsmpost 111106070819-phpapp02
 
N3701 concept lite
N3701 concept liteN3701 concept lite
N3701 concept lite
 
Boost sg msgpack
Boost sg msgpackBoost sg msgpack
Boost sg msgpack
 
MessagePack(msgpack): Compact and Fast Serialization Library
MessagePack(msgpack): Compact and Fast Serialization LibraryMessagePack(msgpack): Compact and Fast Serialization Library
MessagePack(msgpack): Compact and Fast Serialization Library
 
Pub/Sub model, msm, and asio
Pub/Sub model, msm, and asioPub/Sub model, msm, and asio
Pub/Sub model, msm, and asio
 
Emcpp0506
Emcpp0506Emcpp0506
Emcpp0506
 
CppCon2016 report and Boost.SML
CppCon2016 report and Boost.SMLCppCon2016 report and Boost.SML
CppCon2016 report and Boost.SML
 

Similaire à N3495 inplace realloc

Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALegtra
 
Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Takahiro Harada
 
Look into Project Valhalla from CLR viewpoint
Look into Project Valhalla from CLR viewpointLook into Project Valhalla from CLR viewpoint
Look into Project Valhalla from CLR viewpointLogico
 
D言語会議#1
D言語会議#1D言語会議#1
D言語会議#19rnsr
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsKohei KaiGai
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会7shi
 
知って得するC#
知って得するC#知って得するC#
知って得するC#Shota Baba
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Takaaki Suzuki
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)Takuya Kawabe
 
130710 02
130710 02130710 02
130710 02openrtm
 
Jvm internal
Jvm internalJvm internal
Jvm internalGo Tanaka
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiKen'ichi Sakiyama
 
OpenCLに触れてみよう
OpenCLに触れてみようOpenCLに触れてみよう
OpenCLに触れてみようYou&I
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしようYasuhiro Yoshimura
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化についてAimingStudy
 
20170422 azure portal cli 使いこなし
20170422 azure portal cli 使いこなし20170422 azure portal cli 使いこなし
20170422 azure portal cli 使いこなしTakayoshi Tanaka
 
[豆ナイト]Java small object programming
[豆ナイト]Java small object programming[豆ナイト]Java small object programming
[豆ナイト]Java small object programmingYuichi Hasegawa
 

Similaire à N3495 inplace realloc (20)

Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Look into Project Valhalla from CLR viewpoint
Look into Project Valhalla from CLR viewpointLook into Project Valhalla from CLR viewpoint
Look into Project Valhalla from CLR viewpoint
 
D言語会議#1
D言語会議#1D言語会議#1
D言語会議#1
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database Analytics
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7
 
Open modeler
Open modelerOpen modeler
Open modeler
 
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
 
130710 02
130710 02130710 02
130710 02
 
Jvm internal
Jvm internalJvm internal
Jvm internal
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapi
 
OpenCLに触れてみよう
OpenCLに触れてみようOpenCLに触れてみよう
OpenCLに触れてみよう
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
 
20170422 azure portal cli 使いこなし
20170422 azure portal cli 使いこなし20170422 azure portal cli 使いこなし
20170422 azure portal cli 使いこなし
 
[豆ナイト]Java small object programming
[豆ナイト]Java small object programming[豆ナイト]Java small object programming
[豆ナイト]Java small object programming
 

Dernier

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 

Dernier (9)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 

N3495 inplace realloc

  • 1. N3495 inplace realloc 2013/12/14 13:30 to 18:00 に開催された、C++14勉強会 http://atnd.org/events/45289 での発表内容に、その後のフォローアップ内容を追記 SC22WG21 エキスパート 近藤 貴俊 (株式会社 オージス総研) 2014/1/30 1
  • 2. N3495 提案概要 • 提案者 – Ariane van der Steldt ariane@stack.nl • 提案日 – 2012-12-07 • std::allocator_traits にC言語のreallocのよう に アロケート済みメモリのリサイズが可能 な インターフェースを追加しようという提 案 2014/1/30 2
  • 3. N3495 IV 提案インターフェース 2014/1/30 template<typename Alloc> class std::allocator_traits { public: リサイズしたいメモリのポインタ ... /* Existing definition. */ static pointer alloc_resize(Alloc& a, pointer p, size_type n_cur, size_type n_new) { 現在の(変更前の)サイズ 変更後のサイズ /* * p, having n_cur elements, reallocのようにメモリの移動は行わない * would change to having n_new elements. * If the allocator does not support this, * std::bad_alloc() is thrown. 要素を増やすことができない場合は、 std::bad_alloc()をthrow * * (p, n_cur) must refer to a previous allocation, * or the behaviour is undefined. 前回の確保に対応していないのを渡したら * undefined behavior * This function is implemented as: * a.alloc_resize(p, n_cur, n_new) iff implemented by Alloc, * or as * throw std::bad_alloc() otherwise. */ return p; 実装されていない場合はstd::bad_alloc()をthrow } }; 3
  • 5. V N3495 失敗時にbad_allocを返すことについて • mis-useの可能性を最小化する – 例外なので戻り値チェック漏れがない • アロケータの実装とメモリの使用状況に よるが、極めて頻繁に例外発生パスを通 過し得る 2014/1/30 5
  • 6. V N3495 この機能の追加について • マイクロソフトがheapの実装で類似の機能を 用いている • reallocの、メモリの移動が発生しない場合の 挙動と同じsemanticsである • O(n)の操作をO(1)にできる • アロケータがresize_allocを提供しない場合、 bad_alloc()をthrowするため、追加の機能が必要と コンテナでそれをcatchしてallocate - move する処理のことだと思われる なる しかし、良いコンパイラはinline展開を行い、 さらに、このthrowとcatchを取り除く最適化を行う だ try { throw std::bad_alloc(); } catch (std::bad_alloc const&) が無くなるということか? ろう。 inline展開 光成さんの指摘、および、その後のML議論で、そのような最適化は現在行われていないことを確認 2014/1/30 https://groups.google.com/a/isocpp.org/forum/#!searchin/std-proposals/inplace/std-proposals/enjN4nBon4M/RIl4Rgh5bakJ 6
  • 7. V N3495 この機能の追加について • Actually a big counter-argument, which I suspect is the cause for this not being in the c++11 standard in the first place: – CON: exact semantics not supported by the C standard, nor in new[]/delete[] operators, making an implementation for std::allocator hard. • C標準では、このsemacticsがサポートされていない reallocで、メモリアドレスそのままで伸長できない場合、メモリの移動が発生してしま う • new[], delete[] でもリサイズはできない • std::allocatorの実装が大変である 伸長できないとき、null ポインタを返すような、resizeみたいなものがあればいいのかな 後ほど、深掘りして議論する 2014/1/30 7
  • 8. N3495 V 【参考】libsupc++ new_op.cc の実装 using std::new_handler; using std::bad_alloc; #if _GLIBCXX_HOSTED using std::malloc; #else // A freestanding C runtime may not provide "malloc" -- but there is no // other reasonable way to implement "operator new". extern "C" void *malloc (std::size_t); #endif _GLIBCXX_WEAK_DEFINITION void * operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc) { void *p; /* malloc (0) is unpredictable; avoid it. */ if (sz == 0) sz = 1; p = (void *) malloc (sz); while (p == 0) { new_handler handler = std::get_new_handler (); if (! handler) _GLIBCXX_THROW_OR_ABORT(bad_alloc()); handler (); p = (void *) malloc (sz); } return p; } 2014/1/30 8
  • 9. V N3495 名前候補 • realloc – Cのライブラリ関数と同名で異なるセマンティックス のため却下 • realloc_inplace – 同上 • reallocate_inplace – 名前が長すぎるので却下 • alloc_resize – existing allocationをresizeするのでOK 振る舞いが提案の主題で、名前は2の次。良い名前Welcome 2014/1/30 9
  • 10. N3495 V.1 サイズ拡張の成功率向上要因 • ASLR(Address Space Layout Randomization) – 今時の多くのアロケータは、ASLRを用いてい る – この結果、アロケートされたメモリブロック 間に 「2つの並行して行われる」というのは、あまり関係ない気がする 隙間が生じやすい • メモリの解放 – 2つの並行して行われるメモリアロケーション において、確保済みメモリが解放されること で、隙間が生じたり、拡がったりする。 2014/1/30 10
  • 11. N3495 std::allocatorでalloc_resizeを実装 • Cとは全く別のアロケータ – Cとの共存時、効率が悪いのでNG • リサイズ可能かどうかを調べる、try_realloc みたいな関数をどこかに追加 – reallocを呼ぶまでに状態が変わるのでNG • リサイズ可能ならリサイズし、そうでなければ、 nullポインタを返すresize みたいな関数を どこかに追加 – Cのreallocの前半処理みたいなイメージ – よさげ? 2014/1/30 11
  • 12. N3495 resizeをどこに追加する? • C標準ライブラリ – Cの規格改定に合わせて提案が必要 – Cユーザにメリットがあるか、不明 • C++では、move時にmemcpyでは困るという強い動機がある。 • C++標準ライブラリ 今回追加 – malloc, free, realloc との整合性が気になる 宣言済み – namespace std { using malloc; using free; using realloc; resizeの定義; } – resizeの実装を行うためには、C標準ライブラリの内部実装 (freelistとか)の知識が必要。同期してUpdateするなどメンテも必要。 • g++, clang++, VC++など全てCと合わせてリリースしているので問題は少ない? – C++規格で、resizeの説明を記述するのが、大変そう • mallocとかの詳細はC規格参照としつつ書けるかどうか。。。 2014/1/30 12
  • 13. N3495 誤り指摘 • VI: Technical specifications XXX not the actual wording in the final standard, mostly intended to illustrate the proposed semantics. std::allocator may or may not implement std::allocator<T>::alloc_resize(pointer p, size_type n_cur, size_type n_new). If the combination (p, n_cur) does not reflect an existing allocation, an std::invalid_argument exception will be thrown. undefined behaviorの誤りだと思われる。 2014/1/30 13