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
590
コンテナと文字列の中間インタフェースspanとstring_view
Akira Takahashi
June 15, 2024
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
2.8k
C++20 射影変換
faithandbrave
0
700
C++26アップデート 2025-03
faithandbrave
0
1.9k
C++26 エラー性動作
faithandbrave
2
1.2k
C++20の整数
faithandbrave
0
240
C++23 スタックトレースライブラリ
faithandbrave
0
560
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.4k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.2k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Programming
See All in Programming
Module Harmony
petamoriken
2
570
OSS開発者の憂鬱
yusukebe
14
11k
AI時代もSEOを頑張っている話
shirahama_x
0
180
Duke on CRaC with Jakarta EE
ivargrimstad
0
250
モダンJSフレームワークのビルドプロセス 〜なぜReactは503行、Svelteは12行なのか〜
fuuki12
0
120
Atomics APIを知る / Understanding Atomics API
ssssota
1
220
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
2.6k
なぜ強調表示できず ** が表示されるのか — Perlで始まったMarkdownの歴史と日本語文書における課題
kwahiro
12
7.3k
AWS CDKの推しポイントN選
akihisaikeda
1
210
アーキテクチャと考える迷子にならない開発者テスト
irof
9
3.3k
イベントストーミングのはじめかた / Getting Started with Event Storming
nrslib
1
740
手軽に積ん読を増やすには?/読みたい本と付き合うには?
o0h
PRO
1
110
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Site-Speed That Sticks
csswizardry
13
970
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
We Have a Design System, Now What?
morganepeng
54
7.9k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
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 ͋Γ·͢ ઢܗϥΠϒϥϦͰଟ༻͍ͯ͘͜͠ͱʹͳΔ