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
550
コンテナと文字列の中間インタフェース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.5k
C++20 射影変換
faithandbrave
0
620
C++26アップデート 2025-03
faithandbrave
0
1.6k
C++26 エラー性動作
faithandbrave
2
1.1k
C++20の整数
faithandbrave
0
220
C++23 スタックトレースライブラリ
faithandbrave
0
510
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.2k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.2k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Programming
See All in Programming
物語を動かす行動"量" #エンジニアニメ
konifar
14
4.2k
それ CLI フレームワークがなくてもできるよ / Building CLI Tools Without Frameworks
orgachem
PRO
17
3.8k
Webinar: AI-Powered Development: Transformiere deinen Workflow mit Coding Tools und MCP Servern
danielsogl
0
110
自作OSでDOOMを動かしてみた
zakki0925224
1
1.3k
管你要 trace 什麼、bpftrace 用下去就對了 — COSCUP 2025
shunghsiyu
0
380
React は次の10年を生き残れるか:3つのトレンドから考える
oukayuka
41
16k
Flutter로 Gemini와 MCP를 활용한 Agentic App 만들기 - 박제창 2025 I/O Extended Seoul
itsmedreamwalker
0
130
Understanding Kotlin Multiplatform
l2hyunwoo
0
250
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1k
iOS開発スターターキットの作り方
akidon0000
0
240
マイコンでもRustのtestがしたい その2/KernelVM Tokyo 18
tnishinaga
2
1.9k
AIコーディングエージェント全社導入とセキュリティ対策
hikaruegashira
16
9.6k
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
49
14k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Agile that works and the tools we love
rasmusluckow
329
21k
Mobile First: as difficult as doing things right
swwweet
223
9.9k
How GitHub (no longer) Works
holman
314
140k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
Music & Morning Musume
bryan
46
6.7k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
Designing for Performance
lara
610
69k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
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 ͋Γ·͢ ઢܗϥΠϒϥϦͰଟ༻͍ͯ͘͜͠ͱʹͳΔ