SlideShare a Scribd company logo
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

More Related Content

What's hot

ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
MITSUNARI Shigeo
 
.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」
Fujio Kojima
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
MITSUNARI Shigeo
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
mitsutaka_takeda
 
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
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
Tatsuki SHIMIZU
 
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++0x
yak1ex
 
プログラミング技法特論第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
 
Boost17 cpplinq
Boost17 cpplinqBoost17 cpplinq
Boost17 cpplinq
miki_hirofumi
 
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
Kiyoshi Ogawa
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話
Moriyoshi Koizumi
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2sunaemon
 

What's hot (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
 

Viewers also liked

Boostsapporomsmpre 111030054504-phpapp02
Boostsapporomsmpre 111030054504-phpapp02Boostsapporomsmpre 111030054504-phpapp02
Boostsapporomsmpre 111030054504-phpapp02
Takatoshi Kondo
 
Effective Modern C++ study group Item39
Effective Modern C++ study group Item39Effective Modern C++ study group Item39
Effective Modern C++ study group Item39
Takatoshi Kondo
 
Boostsapporomsmpost 111106070819-phpapp02
Boostsapporomsmpost 111106070819-phpapp02Boostsapporomsmpost 111106070819-phpapp02
Boostsapporomsmpost 111106070819-phpapp02
Takatoshi Kondo
 
N3701 concept lite
N3701 concept liteN3701 concept lite
N3701 concept lite
Takatoshi 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 Library
Takatoshi Kondo
 
Pub/Sub model, msm, and asio
Pub/Sub model, msm, and asioPub/Sub model, msm, and asio
Pub/Sub model, msm, and asio
Takatoshi Kondo
 
Emcpp0506
Emcpp0506Emcpp0506
Emcpp0506
Takatoshi Kondo
 
CppCon2016 report and Boost.SML
CppCon2016 report and Boost.SMLCppCon2016 report and Boost.SML
CppCon2016 report and Boost.SML
Takatoshi Kondo
 

Viewers also liked (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
 

Similar to N3495 inplace realloc

Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
egtra
 
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 viewpoint
Logico
 
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 Analytics
Kohei KaiGai
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
7shi
 
知って得するC#
知って得するC#知って得するC#
知って得するC#Shota Baba
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7
Takaaki 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 programming
Yuichi Hasegawa
 

Similar to 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
 

Recently uploaded

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 

Recently uploaded (9)

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 

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