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
コンテナと文字列の中間インタフェースspanとstring_view
Search
Akira Takahashi
June 15, 2024
Programming
1
390
コンテナと文字列の中間インタフェースspanとstring_view
Akira Takahashi
June 15, 2024
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
C++26 エラー性動作
faithandbrave
2
950
C++20の整数
faithandbrave
0
120
C++23 スタックトレースライブラリ
faithandbrave
0
380
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1k
C++20からC++23までの変化
faithandbrave
9
12k
オープン化が進むC++の現状と展望
faithandbrave
19
11k
C++20 status
faithandbrave
0
920
Other Decks in Programming
See All in Programming
DROBEの生成AI活用事例 with AWS
ippey
0
130
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
2
170
Domain-Driven Transformation
hschwentner
2
1.9k
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
0
190
富山発の個人開発サービスで日本中の学校の業務を改善した話
krpk1900
4
380
ASP. NET CoreにおけるWebAPIの最新情報
tomokusaba
0
370
Amazon Q Developer Proで効率化するAPI開発入門
seike460
PRO
0
110
ペアーズでの、Langfuseを中心とした評価ドリブンなリリースサイクルのご紹介
fukubaka0825
2
320
ソフトウェアエンジニアの成長
masuda220
PRO
10
1.1k
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
10
3.6k
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
690
Conform を推す - Advocating for Conform
mizoguchicoji
3
690
Featured
See All Featured
A designer walks into a library…
pauljervisheath
205
24k
Into the Great Unknown - MozCon
thekraken
35
1.6k
How GitHub (no longer) Works
holman
314
140k
Docker and Python
trallard
44
3.3k
Visualization
eitanlees
146
15k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.3k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Thoughts on Productivity
jonyablonski
69
4.5k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
KATA
mclloyd
29
14k
Designing for Performance
lara
604
68k
Transcript
ίϯςφɾจࣈྻͷதؒΠϯλϑΣʔε TQBOͱTUSJOH@WJFX ߴڮ থ "LJSB5BLBIBTIJ GBJUIBOECSBWF!HNBJMDPN 1SFGFSSFE/FUXPSLT *OD ۚ
$ .*9
৽ඪ४ɿίϯςφͱจࣈྻͷड͚औΓํ • $ Ͱೖͬͨstd::spanίϯςφΛड͚औΔͨΊͷܕ • $ Ͱೖͬͨstd::string_viewจࣈྻΛड͚औΔͨΊͷܕ • ͜ΕΒৗతʹ͏ϢʔςΟϦςΟͰ͕͢ɺ᠘͋Γ·͢ •
Ұஈ֊ϥοϓ͢Δ͜ͱͰɺΑΓศརʹͳΔέʔε͋Γ·͢ • ৽ͨͳͨΓલͱͳΔ࡞๏ΛֶΜͰ͍͖·͠ΐ͏
TQBO $ void process(span<int> data) { for (int
x : data) { println("{}", x); } } vector<int> v = {1, 2, 3}; int ar[] = {4, 5, 6}; process(span<int>{v}); // 明示的な変換が必要 process(ar); • TQBOɺϝϞϦ࿈ଓੑͷ͋Δίϯςφ WFDUPSྻ Λ ڞ௨ͯ͠ड͚औΔΠϯλϑΣʔεͱͯ͠༻Ͱ͖Δܕ • ॴ༗ݖΛͨͣɺઌ಄ཁૉͷϙΠϯλͱαΠζ͚ͩΛͭ
TQBO $ void process(span<int> data) { // 一部配列を取り出したりしても要素のコピーが発生しない
process_header(data.front()); process_body(span{data.begin() + 1, data.end()}); } • ཁૉͷίϐʔ͕ൃੜ͠ͳ͍ͷͰɺؾܰʹ෦ྻͷૢ࡞͕Ͱ͖Δ • ͨͩ͠ɺॴ༗ݖΛ͓ͬͯΒͣ σʔλࢀর͍ͯ͠Δ͚ͩ ࣋ͪӡͼʹ͔ͳ͍ͷͰҙ
TUSJOH@WJFX $ void process(string_view sv) { println("{}", sv.substr(1, 3));
} process("Hello"); process(string{"World"}); • string_viewɺจࣈྻͱstringͷڞ௨ΠϯλϑΣʔε • จࣈྻʹରͯ͠stringͷศརͳϝϯόؔΛ͑Δ • ཁૉͷίϐʔϝϞϦ֬อ͕ൃੜ͠ͳ͍ͷͰ ෦จࣈྻͷૢ࡞ؾܰʹͰ͖Δ • ॴ༗ݖΛͨͳ͍ͷͰɺ࣋ͪӡͼʹ͋·Γ͔ͳ͍ • จࣈྻϦςϥϧTUBUJDͳण໋ΛͭͷͰɺͱͯ͠จࣈྻϦςϥϧΛ ͭ߹࣋ͪӡΔ
᠘ͦͷ෦ྻͰඌ͕ͣΕΔ void f(const char* s) { cout << s <<
endl; } void process(string_view sv) { f(sv.substr(1, 3).data()); } process("Hello"); // 「ell」を期待するが「ello」が出力される • const char*ͰจࣈྻΛड͚औΔؔʹ෦จࣈྻΛ͢ͱ Γൈ͍ͨൣғͰͳ͘ඌ·Ͱͬͯ͠·͏ • f(const char* s, int size)ܗࣜʹͳ͍ͬͯͳ͍ͱࠔΔ • ͦͷΑ͏ͳঢ়گͰɺҰ୴TUSJOHʹมͨ͠Γ͢Δඞཁ͕͋Δ • ͘͠ɺඌΛΕͳ͍Α͏҆શʹϥοϓ͢Δ͜ͱߟ͑ΒΕΔ
᠘ͦͷ࣋ͪӡͼʹ͍͘ class X { vector<int> _data; public: // こういう使い方はOK span<int>
f() { return {_data.begin() + 1, _data.end()}; } // コンパイルは通るけど寿命切れ span<int> g() { vector<int> x = {1, 2, 3}; return {x.begin() + 1, x.end()}; } }; • spanͱstring_view ॴ༗ݖΛͨͳ͍ͷ Ͱ࣋ͪӡͼʹ͍͘ • ؔͷΓܕʹ ͠ʹ͍͘͠ɺϝϯό มͱͯͭ͠ͷ Ή͔͍ͣ͠
ॴ༗ݖΛPQUJPOBM লུՄ ʹͨͤΔ֦ு life_string_view f(life_string_view sv) { return sv.substr(1, 3);
} life_string_view g() { string s = "Hello"; return f(life_string_view::allocate(move(s))); } • string_viewܰྔͩ͠ɺ͍͍ͩͨͷσʔλจࣈྻϦςϥϧ TUBUJDͳण໋ ͔ͩΒɺͰ͖Εstring_viewͰ࣋ͪӡͼ͍ͨ • ͚ͩͲͨ·ʹจࣈྻϑΥʔϚοτͨ͠จࣈྻΛ͍࣋ͨͤͨ • ͜͏͍͏߹ͷͨΊʹɺॴ༗ݖΛͭΦϒδΣΫτΛPQUJPOBMʹ࣋ ͨͤΔ֦ு͕ߟ͑ΒΕΔ
ॴ༗ݖΛPQUJPOBM লུՄ ʹͨͤΔ֦ு struct life_string_view { std::string_view _data; std::shared_ptr<void> _life;
template <class T> static life_string_view allocate(T&& data) { auto p = std::make_shared<T>(std::forward<T>(data)); return {*p, p}; } …string_viewと同じメンバ関数を実装… • shared_ptr<void>Ͱॴ༗ݖΛ͍ͬ͠ΐʹ࣋ͪӡͿ • ॴ༗ݖΛͨ͞ͳ͚Εۭͷshared_ptr ϙΠϯλͱBUPNJDࢀরΧ ϯτ ͚ͩ༨ʹͭ
ิ • string_viewʹॴ༗ݖΛͨͤΔΞΠσΟΞɺBTZOD@NRUUϥ ΠϒϥϦ ۙ౻وढ़͞Μ࡞ Ͱ࣮ࡍʹΘΕ͍ͯ·͢ • IUUQTHJUIVCDPNSFECPMU[BTZOD@NRUUCMPCCGBEB EGFBCFCFFGBJODMVEFBTZOD@NRUUVUJMCVGGFS IQQ
• spanͱstring_view$ ͷ৽ৗࣝͱͯ͠ৗతʹΘΕ͍ͯ ͘͜ͱʹͳΓ·͕͢ɺؕΓ͍͢᠘͋Γ·͢ • ࡞๏Λʹ͚ͭͯɺ҆શʹ͍͖ͬͯ·͠ΐ͏ • ˎ ྻΛଟ࣍ݩྻͱͯ͠ΞΫηεͰ͖ΔΑ͏ʹ͢Δmdspan ͋Γ·͢ ઢܗϥΠϒϥϦͰଟ༻͍ͯ͘͜͠ͱʹͳΔ