C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part144
https://mevius.5ch.net/test/read.cgi/tech/1563769115/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
探検
C++相談室 part145
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2019/09/13(金) 17:13:24.60ID:/ygW08Jq458デフォルトの名無しさん
2019/10/13(日) 17:23:50.21ID:Y5pFrXym >>457
パイソン
パイソン
459デフォルトの名無しさん
2019/10/13(日) 17:31:01.31ID:9auzzyVZ 言語間のABIの違いを透過的にしたいのならアセンブラの出番だね
460デフォルトの名無しさん
2019/10/13(日) 17:36:26.67ID:1+8oai62 まさにそういう用途で作られたluaとか
461デフォルトの名無しさん
2019/10/13(日) 17:44:25.71ID:j3fG3YC6 >>457
今ならluaかjs(V8/ChakraCore/SpiderMonkey)だな。
【Lua】組み込み系言語総合 その7【Squirrel】 [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1474536226/
pythonもできなくはないけど手軽とは言えない。
pythonを使いたい理由がなければやめておくのが吉。
今ならluaかjs(V8/ChakraCore/SpiderMonkey)だな。
【Lua】組み込み系言語総合 その7【Squirrel】 [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1474536226/
pythonもできなくはないけど手軽とは言えない。
pythonを使いたい理由がなければやめておくのが吉。
462デフォルトの名無しさん
2019/10/13(日) 18:10:48.99ID:pJwii1Hg pythonは呼ぶ方で、呼ばれる方としてはほとんど想定されてないわな。
463デフォルトの名無しさん
2019/10/13(日) 19:05:43.03ID:m8H1BiEu lua以外無い
464デフォルトの名無しさん
2019/10/13(日) 19:35:48.57ID:rjz838Ki >>457
tcl
tcl
465デフォルトの名無しさん
2019/10/13(日) 20:24:22.36ID:kfwaB+Y7 >455,456さんどうもです
エラーが出たらそうしてみます
リンク先を読んで見ましたが
自分には難しいのでそのページを手がかりに検索して(依存名で探してみた)
漸く理解出来た気がします
前にstd::を付ける付けないって話を何処かでしてい
自分的にはどうしたものだろうか?
って感じだったんですけど
adlやtwophasenameとかの解説と合わせて書いて有るのを呼んでいて
std::を付けるのはかなり重要なんだと思えてきた
今までnamespaceって単なるグループ名を付けている
くらいの感覚だったんですけど
意外と重要なんですね
どうもでした
エラーが出たらそうしてみます
リンク先を読んで見ましたが
自分には難しいのでそのページを手がかりに検索して(依存名で探してみた)
漸く理解出来た気がします
前にstd::を付ける付けないって話を何処かでしてい
自分的にはどうしたものだろうか?
って感じだったんですけど
adlやtwophasenameとかの解説と合わせて書いて有るのを呼んでいて
std::を付けるのはかなり重要なんだと思えてきた
今までnamespaceって単なるグループ名を付けている
くらいの感覚だったんですけど
意外と重要なんですね
どうもでした
466デフォルトの名無しさん
2019/10/14(月) 15:05:53.73ID:rfaLGQBa template<size_t N>
class Test{
public:
private:
int m[N];
};
上の様なクラスでコンストラクタでmを値を指定して初期化したいんだけどNの数は未定ではないですか。
こういう場合のコンストラクタの書き方ってどうすればいいのでしよう?
可変引数?
class Test{
public:
private:
int m[N];
};
上の様なクラスでコンストラクタでmを値を指定して初期化したいんだけどNの数は未定ではないですか。
こういう場合のコンストラクタの書き方ってどうすればいいのでしよう?
可変引数?
467デフォルトの名無しさん
2019/10/14(月) 15:12:05.32ID:BPBGG2nS コンパイル時に決まってないならvectorかなんかにするしかない
468デフォルトの名無しさん
2019/10/14(月) 15:18:08.00ID:P81x9Tjl templateパラメータの整数にはコンパイル時に決まらない数値は入れられない
469デフォルトの名無しさん
2019/10/14(月) 15:28:00.19ID:qN7fFVrS >>466
そもそも、そのような生配列は、デフォルトでは0初期化もされないので、
メンバ初期化子リストを使わなくても効率は落ちないので、
コンストラクタ内部で普通に代入演算子を使って初期化すればいい。
すると、単に任意個数の引数をコンストラクタに渡す問題になる。
それには、昔ながらの va_list を使って渡す方法と、
関数テンプレートやテンプレートクラスを使って、自分自身を一つずつ引数を
減らしながら呼び出していく方法の二通りある。
そもそも、そのような生配列は、デフォルトでは0初期化もされないので、
メンバ初期化子リストを使わなくても効率は落ちないので、
コンストラクタ内部で普通に代入演算子を使って初期化すればいい。
すると、単に任意個数の引数をコンストラクタに渡す問題になる。
それには、昔ながらの va_list を使って渡す方法と、
関数テンプレートやテンプレートクラスを使って、自分自身を一つずつ引数を
減らしながら呼び出していく方法の二通りある。
470デフォルトの名無しさん
2019/10/14(月) 15:28:52.79ID:Y7o3BEyU471デフォルトの名無しさん
2019/10/14(月) 15:30:45.59ID:rfaLGQBa >>469
一度考えたのはテンプレートの可変引数なんですが
//Testのコンストラクタ
template<typename... T>
Test(T... args):m{args...}{
}
templateの可変引数の為にどんな型でも一致してしまい、そのくせにdoubleからintなどの変換をしてくれないのでinitializer_listを引数に出来たり、もしくはもっといい初期化方法があるのかなと思った次第です。
一度考えたのはテンプレートの可変引数なんですが
//Testのコンストラクタ
template<typename... T>
Test(T... args):m{args...}{
}
templateの可変引数の為にどんな型でも一致してしまい、そのくせにdoubleからintなどの変換をしてくれないのでinitializer_listを引数に出来たり、もしくはもっといい初期化方法があるのかなと思った次第です。
472デフォルトの名無しさん
2019/10/14(月) 16:18:31.70ID:1VO4fG6M473デフォルトの名無しさん
2019/10/14(月) 16:48:34.42ID:REdvl5Gt >>471
>そのくせにdoubleからintなどの変換をしてくれないので
この点に関しては、以下の拡張展開でいけるはず。
template<typename... T>
Test(T... args):m{((int)args)...}{
}
>そのくせにdoubleからintなどの変換をしてくれないので
この点に関しては、以下の拡張展開でいけるはず。
template<typename... T>
Test(T... args):m{((int)args)...}{
}
474デフォルトの名無しさん
2019/10/14(月) 16:55:25.15ID:REdvl5Gt templateの「非型引数」を使えば、理論上は、
template<int...args>
Test(int...args):m{args...}{
}
と書ける可能性はあるかもしれないけど、試してみてないので分からない。
template<int...args>
Test(int...args):m{args...}{
}
と書ける可能性はあるかもしれないけど、試してみてないので分からない。
475デフォルトの名無しさん
2019/10/14(月) 17:04:44.38ID:REdvl5Gt C++11 から、template 仮引数(パラメーター)に非型パラメーターパックが使える。
分かっているとは思うけど、このパックとは可変長引数をまとめて入れる容器の様な意味。
実際にやってみてないのでわからない。
https://en.cppreference.com/w/cpp/language/template_parameters
【Non-type template parameter】
type ... name(optional) (3) (since C++11)
3) A non-type template parameter pack with an optional name.
分かっているとは思うけど、このパックとは可変長引数をまとめて入れる容器の様な意味。
実際にやってみてないのでわからない。
https://en.cppreference.com/w/cpp/language/template_parameters
【Non-type template parameter】
type ... name(optional) (3) (since C++11)
3) A non-type template parameter pack with an optional name.
476デフォルトの名無しさん
2019/10/14(月) 17:48:47.38ID:DdI7aqm2 >>466
要素数がコンパイル時に決まってるなら std::array 使って Test<3> x{{1,2,3}} とすることは簡単にできそう。
要素数がコンパイル時に決まってるなら std::array 使って Test<3> x{{1,2,3}} とすることは簡単にできそう。
478デフォルトの名無しさん
2019/10/16(水) 00:49:52.16ID:4OT/K/L6 >>473 Thank you!!
479デフォルトの名無しさん
2019/10/18(金) 03:20:02.11ID:kbBE7aSe 他クラスのメンバ関数テンプレートを呼び出すときってtemplateキーワードを関数名の前に付けないと
operator<と間違われてエラーになりますですよね?具体的に例をあげてみますと
https://wandbox.org/permlink/F7zl1fDh3qc216hd
これの t.template func<T2>(); のところですが、実はこのtemplateキーワードを外しても
WindowsのVisualStudioだとコンパイルが通ってしまいます。
これってVisualStudioが規約違反しているという理解で合っていますか?
operator<と間違われてエラーになりますですよね?具体的に例をあげてみますと
https://wandbox.org/permlink/F7zl1fDh3qc216hd
これの t.template func<T2>(); のところですが、実はこのtemplateキーワードを外しても
WindowsのVisualStudioだとコンパイルが通ってしまいます。
これってVisualStudioが規約違反しているという理解で合っていますか?
480デフォルトの名無しさん
2019/10/18(金) 03:32:35.18ID:L8qU11hp vsのバージョンは?
2017の途中からtwo phaseに対応しだしてtemplate周りの怪しい挙動は大分改善された
2017の途中からtwo phaseに対応しだしてtemplate周りの怪しい挙動は大分改善された
481デフォルトの名無しさん
2019/10/18(金) 11:35:03.93ID:kGqx1xn0 >>480
Express 2017 for Windows DesktopとProfessional 2019で確認しています
準拠モードを「はい」にしたら標準の規約に従うのかと思ったんですが変化なしでした
開発はWindowsでしつつもWindowsとLinuxどちらでもコンパイルできるようにしたいんですが
もしかしてそう簡単な話ではないんですかね
Express 2017 for Windows DesktopとProfessional 2019で確認しています
準拠モードを「はい」にしたら標準の規約に従うのかと思ったんですが変化なしでした
開発はWindowsでしつつもWindowsとLinuxどちらでもコンパイルできるようにしたいんですが
もしかしてそう簡単な話ではないんですかね
482デフォルトの名無しさん
2019/10/18(金) 12:11:07.40ID:8CoI4J3v >>481
visual studio cmakeプロジェクトでググる
visual studio cmakeプロジェクトでググる
483デフォルトの名無しさん
2019/10/18(金) 15:49:49.04ID:/qIwU54Z effective modern c++のnoexceptの項読んで思ったんだが、
C++の関数内でCの関数(具体的にはOpenGLとか)を呼び出した時に
C++側でcatchできる例外って具体的にどんなものがあるの?
試したことないけどmalloc失敗でbad_allocは飛ばないよね?
C++の関数内でCの関数(具体的にはOpenGLとか)を呼び出した時に
C++側でcatchできる例外って具体的にどんなものがあるの?
試したことないけどmalloc失敗でbad_allocは飛ばないよね?
484デフォルトの名無しさん
2019/10/18(金) 18:57:22.15ID:eJANlQqR Windowsなら構造化例外とか
485デフォルトの名無しさん
2019/10/18(金) 19:16:01.68ID:rTjJuJDg486デフォルトの名無しさん
2019/10/18(金) 19:19:00.58ID:5559SrY6 VCコンパイラがWindows専用だからcmakeだけでは解決しない
clangオプション使えばいけるんじゃね
clangオプション使えばいけるんじゃね
487デフォルトの名無しさん
2019/10/18(金) 19:27:02.65ID:BPo3Wxa0 cmakeってなんとなくしか使ってないんですけど何なんですか
OpenCVのソースをビルドするときに使いましたけど、cmakeした後にまたVisual Studioでコンパイルする必要があるのはなぜですか
OpenCVのソースをビルドするときに使いましたけど、cmakeした後にまたVisual Studioでコンパイルする必要があるのはなぜですか
488デフォルトの名無しさん
2019/10/18(金) 21:38:24.25ID:1VxWd/yq489デフォルトの名無しさん
2019/10/18(金) 22:32:33.72ID:HsDKWWc7 >>487
ビルドするためのスクリプトを作るツール、みたいに考えるといいよ
linux環境ならLinux用のものを作ってくれる
makeだと基本はlinux専用だし、.slnや.vcxprojはwindows専用だから、両方を面倒見るのは大変でしょ
ビルドするためのスクリプトを作るツール、みたいに考えるといいよ
linux環境ならLinux用のものを作ってくれる
makeだと基本はlinux専用だし、.slnや.vcxprojはwindows専用だから、両方を面倒見るのは大変でしょ
490デフォルトの名無しさん
2019/10/18(金) 22:48:18.41ID:f2FG8XiO ビルドするためのスクリプトを作るためのスクリプトを作るためのスクリプトなんてよくある話だよ。
491デフォルトの名無しさん
2019/10/18(金) 22:49:57.04ID:a3uRi/Ig 秘伝のタレな
492デフォルトの名無しさん
2019/10/18(金) 23:06:23.18ID:liCy40EB GNU autotoolsをまともにいじる輩は消え去ったという現実をcmakeも味わうことになる。
バカは同じ間違いをする。歴史も見ずに。
バカは同じ間違いをする。歴史も見ずに。
493デフォルトの名無しさん
2019/10/19(土) 00:19:02.04ID:JKxr+RAJ CMakeってKitwareっていう大学発ベンチャーから出てきたやつだよな
もとはVTKとか可視化用ライブラリ開発してるしがないベンチャーだったのに
CMakeのおかげでやたら顔が知られるようになった
もとはVTKとか可視化用ライブラリ開発してるしがないベンチャーだったのに
CMakeのおかげでやたら顔が知られるようになった
494デフォルトの名無しさん
2019/10/19(土) 00:40:35.72ID:kiA3Djjo VTKとparaviewの方が有名じゃなかったのか
495デフォルトの名無しさん
2019/10/19(土) 00:44:42.31ID:JKxr+RAJ ParaViewは最近になって有名になってるけど所詮はVTKのラッパーでしょ
CMakeのほうが影響度はでかいと思う
ベンチャーでここまでやれたなら大成功な事例だね
CMakeのほうが影響度はでかいと思う
ベンチャーでここまでやれたなら大成功な事例だね
496デフォルトの名無しさん
2019/10/19(土) 00:58:43.11ID:kiA3Djjo cmakeより前から有名じゃね?
497デフォルトの名無しさん
2019/10/19(土) 01:00:35.87ID:4XSJxZBk cmake邪魔くさい
Makefile.am, configure.acからautoreconfしてconfigure作る方が楽。
windows用もmingwでクロスビルドしちゃえば楽だし。
WSLでwindowsからも見えるパスでビルドすると作ったwindows用binaryをすぐに起動できるしいうことなし
Makefile.am, configure.acからautoreconfしてconfigure作る方が楽。
windows用もmingwでクロスビルドしちゃえば楽だし。
WSLでwindowsからも見えるパスでビルドすると作ったwindows用binaryをすぐに起動できるしいうことなし
498デフォルトの名無しさん
2019/10/19(土) 01:28:27.26ID:kDntEbbb mingw使わずに標準のwindowsの環境で使えるようになってから出直してきて
499デフォルトの名無しさん
2019/10/19(土) 01:36:12.28ID:+xsHXYvs mesonいいぞー
500デフォルトの名無しさん
2019/10/19(土) 01:37:16.21ID:JKxr+RAJ makeとかのビルドツールって超重要なはずなのにおざなりな状況になってるのは不思議だ
なんとかしてくれ
なんとかしてくれ
501デフォルトの名無しさん
2019/10/19(土) 01:49:35.75ID:kiA3Djjo クロスプラットフォームなソフト作るにしても、成果物が対象の環境で動けば良い訳で、ビルドをどの環境でも出来ることにそれほど意味はないからね
てかunix系でgccやclang使って開発しているものをVCに入れても謎の独自仕様でコンパイルできないとかザラだしね
てかunix系でgccやclang使って開発しているものをVCに入れても謎の独自仕様でコンパイルできないとかザラだしね
502デフォルトの名無しさん
2019/10/19(土) 04:05:50.65ID:kDntEbbb >>500
そう言って立ち上がった人は100億人くらいいたが誰一人として帰ってくる者はいなかった
そう言って立ち上がった人は100億人くらいいたが誰一人として帰ってくる者はいなかった
503デフォルトの名無しさん
2019/10/19(土) 04:25:19.36ID:Qviva8VV >>502
ほんとこれw
ほんとこれw
504デフォルトの名無しさん
2019/10/19(土) 07:26:21.05ID:4XSJxZBk >>498
wslでmingwクロス環境はマクソ提供だけど
wslでmingwクロス環境はマクソ提供だけど
505デフォルトの名無しさん
2019/10/19(土) 09:24:58.31ID:wYu0/eCZ あらゆるビルドツールは怪獣化して、怪獣を飼いならすためのラッパーが必要になり、そしてそのラッパーももれなく怪獣化する
歴史が証明しており例外はない
歴史が証明しており例外はない
506デフォルトの名無しさん
2019/10/19(土) 09:25:25.42ID:WQwZNfDO 会社でifstreamのファイルオープンがエラーになるのはなぜなのか不明。assert()で引っかかる。
Visual Studio 2008コマンドプロンプトでコンパイルしたプログラムで、コードは単純化
して示したものが下記のようなもの。
std::ifstream ifs1;
for (n = 0; n < 8; ++n) {
ifs1.open(s[n].c_str());
assert(ifs1); // もしくはassert(ifs1.is_open());
関数(ifs1);
ifs1.close();
ifs1.clear();
}
コーディング上に間違いがあるのかいな。ファイルが使用中のためにエラー
でもないようだし。
よくわからんからCのFILE *に変更して対処したけどコンパイラの欠陥か。
ifstreamを宣言した後に ifs1.clear(); が必要なのか。
Visual Studio 2008コマンドプロンプトでコンパイルしたプログラムで、コードは単純化
して示したものが下記のようなもの。
std::ifstream ifs1;
for (n = 0; n < 8; ++n) {
ifs1.open(s[n].c_str());
assert(ifs1); // もしくはassert(ifs1.is_open());
関数(ifs1);
ifs1.close();
ifs1.clear();
}
コーディング上に間違いがあるのかいな。ファイルが使用中のためにエラー
でもないようだし。
よくわからんからCのFILE *に変更して対処したけどコンパイラの欠陥か。
ifstreamを宣言した後に ifs1.clear(); が必要なのか。
507デフォルトの名無しさん
2019/10/19(土) 09:50:39.86ID:wYu0/eCZ ifsreamってcloseの後に再使用できる保証あったっけ?
ifs1の宣言をfor文の中に入れて毎回オブジェクト作り直す方が無難に見える
ifs1の宣言をfor文の中に入れて毎回オブジェクト作り直す方が無難に見える
508デフォルトの名無しさん
2019/10/19(土) 09:51:32.93ID:wYu0/eCZ 宣言じゃないや定義
509デフォルトの名無しさん
2019/10/19(土) 09:54:59.18ID:Xn59Im0u makeが複雑なんじゃなくて
多様な環境すべてに対応するように書くことが複雑なわけで。
だったらdockerなり使って一つの環境だけでの提供を考える方が楽。
多様な環境すべてに対応するように書くことが複雑なわけで。
だったらdockerなり使って一つの環境だけでの提供を考える方が楽。
510デフォルトの名無しさん
2019/10/19(土) 11:50:11.90ID:Xq/UOX2V511デフォルトの名無しさん
2019/10/19(土) 12:33:25.60ID:IyvFodwr >>484
あれ、Winの構造化例外ってそもそもtry..catchには引っかからなかったような……
あれ、Winの構造化例外ってそもそもtry..catchには引っかからなかったような……
512デフォルトの名無しさん
2019/10/19(土) 12:41:43.65ID:IyvFodwr513デフォルトの名無しさん
2019/10/19(土) 13:51:45.42ID:2wK0PqU+ C++でv8のjavascriptを使うために
インストールしようと色々やってるんだけどどうにもうまく行かない。
https://qiita.com/mofumonta/items/ef3d890e13a7c1701748
このサイトを参考にしながら進めてるんだけど
「depot-toolsインストール」の環境変数を通す項目で
C:\v8\depot_tools\win_tools-2_7_6_bin\python\bin
このパスがダウンロードしてきたdepot-toolsにはないんだけど、
どこにあるか誰か知りませんか?
スレチだったらごめんなさい。
インストールしようと色々やってるんだけどどうにもうまく行かない。
https://qiita.com/mofumonta/items/ef3d890e13a7c1701748
このサイトを参考にしながら進めてるんだけど
「depot-toolsインストール」の環境変数を通す項目で
C:\v8\depot_tools\win_tools-2_7_6_bin\python\bin
このパスがダウンロードしてきたdepot-toolsにはないんだけど、
どこにあるか誰か知りませんか?
スレチだったらごめんなさい。
514デフォルトの名無しさん
2019/10/19(土) 14:48:33.14ID:g7gJ/kc1 おま環
何をダウソしたかくらいは書け
何をダウソしたかくらいは書け
515デフォルトの名無しさん
2019/10/19(土) 15:03:15.21ID:g7gJ/kc1 python2.7 が既に入ってるなら
その bin に path 通しとけば良いんかな
その bin に path 通しとけば良いんかな
516デフォルトの名無しさん
2019/10/19(土) 15:14:23.88ID:Q3nSZoDU >>483
C の関数が呼び出すコールバックを C++ で書いた場合、環境によってはコールバックからの例外が
C の関数を通過してくる。環境によっては通過できずに terminate() するけど。
厳密に「Cの関数」じゃなくなるけど qsort(), bsearch() については例外が通過できるものと規定されている。
あとは未定義動作となる場合の反応として例外が飛んでくることはあるかもしれない。
C の関数が呼び出すコールバックを C++ で書いた場合、環境によってはコールバックからの例外が
C の関数を通過してくる。環境によっては通過できずに terminate() するけど。
厳密に「Cの関数」じゃなくなるけど qsort(), bsearch() については例外が通過できるものと規定されている。
あとは未定義動作となる場合の反応として例外が飛んでくることはあるかもしれない。
517デフォルトの名無しさん
2019/10/19(土) 15:22:29.09ID:2wK0PqU+ >>514
忘れてた。スマヌ。
Windows10 X64
Visual Studio Community 2019
Python 3.7.4(64-bit)
Git version 2.23.0.windows.1
ダウンロードしたのは
https://chromium.googlesource.com/chromium/tools/depot_tools.git
ここから「x64 Native Tools Command Prompt for VS 2019」
で「git clone」を使ってダウンロードしました。
>>515
python自体のbinフォルダは試してませんでした。
ちょっとやってみます。
忘れてた。スマヌ。
Windows10 X64
Visual Studio Community 2019
Python 3.7.4(64-bit)
Git version 2.23.0.windows.1
ダウンロードしたのは
https://chromium.googlesource.com/chromium/tools/depot_tools.git
ここから「x64 Native Tools Command Prompt for VS 2019」
で「git clone」を使ってダウンロードしました。
>>515
python自体のbinフォルダは試してませんでした。
ちょっとやってみます。
518デフォルトの名無しさん
2019/10/19(土) 15:27:23.69ID:g7gJ/kc1 OS とかツールは全部違うけど
https://chromium.googlesource.com/chromium/tools/depot_tools.git
これ clone しても確かに win_tools-2_7_6_bin は無かった
https://chromium.googlesource.com/chromium/tools/depot_tools.git
これ clone しても確かに win_tools-2_7_6_bin は無かった
519デフォルトの名無しさん
2019/10/19(土) 15:29:04.62ID:ydKYIai+ 何故公式のインストール手順を読まないのか
520デフォルトの名無しさん
2019/10/19(土) 19:15:58.17ID:fDUUZQql Node.js じゃ、ダメなのか?
521デフォルトの名無しさん
2019/10/19(土) 20:05:28.35ID:+xsHXYvs >>511
なんか設定次第で引っかかるようにならなかったっけ・・・
なんか設定次第で引っかかるようにならなかったっけ・・・
522517です
2019/10/20(日) 17:45:24.74ID:njFFTJVf523蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 20:19:16.97ID:hyX4MvIl 今、YappyCamという録画ソフトを作っています。以下のソースをご覧下さい。
https://github.com/katahiromz/YappyCam/blob/master/sound.hpp
https://github.com/katahiromz/YappyCam/blob/master/sound.hpp#L125
https://github.com/katahiromz/YappyCam/blob/master/sound.cpp#L154
このSoundが音声を扱うクラスになっております。
スレッド関数Sound::ThreadProcで録音処理を行っています。
std::vector<BYTE> m_wave_dataがサウンドバッファです。
Sound::FlushDataがバッファを吐き出す関数です。
現在、SSDが主流になりつつありますが、ハードディスクでもトラブルなく使えるようにしたいです。いくつか質問します。
1.m_wave_dataをstaticな固定バッファにすべきか。するとすればどれぐらいの容量か。
2.もっといいバッファリングの方法はないか。
お願いします。
https://github.com/katahiromz/YappyCam/blob/master/sound.hpp
https://github.com/katahiromz/YappyCam/blob/master/sound.hpp#L125
https://github.com/katahiromz/YappyCam/blob/master/sound.cpp#L154
このSoundが音声を扱うクラスになっております。
スレッド関数Sound::ThreadProcで録音処理を行っています。
std::vector<BYTE> m_wave_dataがサウンドバッファです。
Sound::FlushDataがバッファを吐き出す関数です。
現在、SSDが主流になりつつありますが、ハードディスクでもトラブルなく使えるようにしたいです。いくつか質問します。
1.m_wave_dataをstaticな固定バッファにすべきか。するとすればどれぐらいの容量か。
2.もっといいバッファリングの方法はないか。
お願いします。
524蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 21:02:47.12ID:hyX4MvIl スピード命です。フレーム落ちは絶対にダメだそうです。
525デフォルトの名無しさん
2019/10/20(日) 21:06:32.98ID:I/H74RW7 古臭いスタイルはさておき・・・
(別にそれでいいと思うよ)
なぜバッファリングしてる?
vectorにためずにwriteしたらいいじゃん
readとwriteの単位が合わないとか?
バッファリングするならreader/writerで別スレッドにした方がいいかもね
オーディオの処理なんだからおれなら動的メモリ確保の走るvectorは使わないね
最悪システムコールだから音が途切れる可能性が高まる
一瞬かもしれないが音は少しでも途切れるとノイズになる
最適なバッファ量はそのルーチンがどれぐらいのジッターで駆動してか計測して決めればいい
あとバッファリングすればそれだけ遅延が発生するから注意
本来ビデオ側と同期をとる必要あるけどPCだと適当だよな
CE機器だと完璧に合わせるけど
(別にそれでいいと思うよ)
なぜバッファリングしてる?
vectorにためずにwriteしたらいいじゃん
readとwriteの単位が合わないとか?
バッファリングするならreader/writerで別スレッドにした方がいいかもね
オーディオの処理なんだからおれなら動的メモリ確保の走るvectorは使わないね
最悪システムコールだから音が途切れる可能性が高まる
一瞬かもしれないが音は少しでも途切れるとノイズになる
最適なバッファ量はそのルーチンがどれぐらいのジッターで駆動してか計測して決めればいい
あとバッファリングすればそれだけ遅延が発生するから注意
本来ビデオ側と同期をとる必要あるけどPCだと適当だよな
CE機器だと完璧に合わせるけど
526デフォルトの名無しさん
2019/10/20(日) 21:15:47.21ID:PJrfugKB COBOLのWRITE命令みたいに非同期書き込み&バッファローテーションてか?
あの当時のアホOSならともかく今どきアプリでそんなことせにゃならんか?
ベアメタルなら面白そうだけど
あの当時のアホOSならともかく今どきアプリでそんなことせにゃならんか?
ベアメタルなら面白そうだけど
527デフォルトの名無しさん
2019/10/20(日) 21:16:42.61ID:Vt7fKSBc 遅延の原因は、vector::insert()でしょ。
528デフォルトの名無しさん
2019/10/20(日) 21:24:56.14ID:akKR2ina ズらすの?
529デフォルトの名無しさん
2019/10/20(日) 21:27:13.38ID:peAHiKUT 誰がハゲやねん
530蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 22:12:11.93ID:2g822Cxo ああそうか。std::FILE/CreateFileそのものがバッファリングしてるんだ。ならば下手なバッファリングは必要ないと。
普通にI/Oすることにします。ありがとうございます。
普通にI/Oすることにします。ありがとうございます。
531蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 22:21:50.50ID:2g822Cxo std::vectorのメモリー動的確保は音声処理では不味いと。
ハードディスク環境でジッターを測定して見ないと。わかりました。
ハードディスク環境でジッターを測定して見ないと。わかりました。
532デフォルトの名無しさん
2019/10/20(日) 22:32:55.48ID:I/H74RW7533蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 22:59:16.11ID:2g822Cxo534蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 23:12:22.20ID:2g822Cxo setvbufって便利な関数を見つけた。これ使うか。
535デフォルトの名無しさん
2019/10/20(日) 23:13:52.92ID:fVQAzz8M 音声のバッファリングには普通はリングバッファを使う
536蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 23:28:56.20ID:2g822Cxo ここまでのまとめ。
リングバッファを使う。
十分大きなバッファサイズでsetvbufを使う。
リングバッファへの読み書きは別スレッドにする。
バッファが空のときはイベント待ちで休ませる。
リングバッファを使う。
十分大きなバッファサイズでsetvbufを使う。
リングバッファへの読み書きは別スレッドにする。
バッファが空のときはイベント待ちで休ませる。
537デフォルトの名無しさん
2019/10/20(日) 23:44:50.34ID:Vt7fKSBc 別スレッドにキューイングするのに適したC++標準クラスは何かな?
538デフォルトの名無しさん
2019/10/21(月) 06:50:33.92ID:iwcvXj42 ゴチャゴチャ言うならビルトイン配列使っとけ
539デフォルトの名無しさん
2019/10/21(月) 15:01:03.56ID:c9dhXgWB C++から呼べるし
C++を呼べる
C++を呼べる
540デフォルトの名無しさん
2019/10/21(月) 15:43:44.16ID:M4XH2/Bk >>537
Queue への読み書きは、1要素当たりは短時間で済むことが多いので、
Queueを読み書きする場所で、必ず Critical Section などで囲むと良い。
一度に沢山の要素をまとめて書き込みたい場合は、原則的には、
1要素を書き込む処理をこまめに、Critical Section で囲むようにする。
必ずしも1要素ずつ囲む必要は無いが、こまめに囲った方が、
別スレッドの待ち時間が減ることが期待できるが、その意味が有る場合と
無い場合とが有る。
Critical Section の代わりに、Mutex や Semaphore などを使うことも出来る。
Queue への読み書きは、1要素当たりは短時間で済むことが多いので、
Queueを読み書きする場所で、必ず Critical Section などで囲むと良い。
一度に沢山の要素をまとめて書き込みたい場合は、原則的には、
1要素を書き込む処理をこまめに、Critical Section で囲むようにする。
必ずしも1要素ずつ囲む必要は無いが、こまめに囲った方が、
別スレッドの待ち時間が減ることが期待できるが、その意味が有る場合と
無い場合とが有る。
Critical Section の代わりに、Mutex や Semaphore などを使うことも出来る。
541デフォルトの名無しさん
2019/10/21(月) 17:20:19.00ID:Yxovtd3S キャッシュに配列を置けばいいじゃねえか
かんたんだろ
APUの近くに配列でOK
複雑なデータ構造なんて考える必要ナシ
かんたんだろ
APUの近くに配列でOK
複雑なデータ構造なんて考える必要ナシ
542デフォルトの名無しさん
2019/10/21(月) 18:19:39.76ID:iwcvXj42 タイミングで問題が出てるのにvectorにこだわるのはアホだよな
543デフォルトの名無しさん
2019/10/21(月) 18:33:52.73ID:K8Ck/3Ch 実行時のパラメータでバッファサイズ可変にするならvectorで始めにresizeしておくのが楽
size使える分配列のunique_ptrより取り回しも楽だし
size使える分配列のunique_ptrより取り回しも楽だし
544デフォルトの名無しさん
2019/10/21(月) 18:43:04.52ID:Kc9FjQwr boostにリングバッファのクラスあるよ
545蟻人間 ◆T6xkBnTXz7B0
2019/10/21(月) 18:50:23.92ID:LVq8IpRv 天才だから自分でリングバッファ作った。
https://github.com/katahiromz/YappyCam/blob/master/ring.hpp
https://github.com/katahiromz/YappyCam/blob/master/ring.hpp
546蟻人間 ◆T6xkBnTXz7B0
2019/10/21(月) 19:22:51.62ID:ICV7tWge バッファがいっぱいになったらどうしよう?
547537
2019/10/21(月) 19:27:27.31ID:iqf1snDW >>540
それらの同期機能って標準C++のクラスだけで実現できるもんなの?
それらの同期機能って標準C++のクラスだけで実現できるもんなの?
548デフォルトの名無しさん
2019/10/21(月) 19:30:51.93ID:Kc9FjQwr >>546
捨てるしかないだろ
捨てるしかないだろ
549デフォルトの名無しさん
2019/10/21(月) 20:56:31.15ID:NgTxqwl+ >>547
どこまでを標準と言ってるのか知らんけどお前の考える標準でスレッドをサポートしてるならたいてい同期機構もあるはず
どこまでを標準と言ってるのか知らんけどお前の考える標準でスレッドをサポートしてるならたいてい同期機構もあるはず
550蟻人間 ◆T6xkBnTXz7B0
2019/10/21(月) 21:02:21.32ID:LVq8IpRv >>547
WindowsではCriticalSection, CreateMutexなどがあったからC++11以前でも使えた。
C++11からstd::mutex, std::lock_guardなどが使えるぞ。
WindowsではCriticalSection, CreateMutexなどがあったからC++11以前でも使えた。
C++11からstd::mutex, std::lock_guardなどが使えるぞ。
551デフォルトの名無しさん
2019/10/22(火) 00:25:01.95ID:IM/z9Y8P ロックフリー的ななんか無かったっけ?
552蟻人間 ◆T6xkBnTXz7B0
2019/10/22(火) 16:18:00.26ID:QN5InCe0 リングバッファの排他制御どうするか?
push/popごとにロックかけたら遅くなりそう。
push/popごとにロックかけたら遅くなりそう。
553デフォルトの名無しさん
2019/10/22(火) 16:36:38.23ID:LzjGZCpL >>545
stlライクにしてる割にコピーやムーブが内部の値ベースなのおかしくない?
stlライクにしてる割にコピーやムーブが内部の値ベースなのおかしくない?
554デフォルトの名無しさん
2019/10/22(火) 17:03:31.86ID:mzkWHCb9 用途的に
reader 1
wrtier 1
だと思うけどそれならwait freeな実装が可能
read pointer/writer pointerで制御するやつね
かつかつに最適化するならこれ
しかしその前にどれだけの頻度と長さで排他の衝突するか見た方がいい
リアルタイムのオーディオなら短くても5msec周期とかじゃないか
かつlock中に多少のメモリの読み書きやってるだけなら排他が必要な時間は短い
なら素朴にmutex1個でのロックで十分な可能性も高い
同期のミスはデバッグがつらいから不用意に難しいことしない方がいい
もしくはある程度のバッファリング(遅延)が許容できるとか、固定長の処理であるなら
ならバッファを複数用意してダブル、トリプルバッファ的な制御でもいいだろう
つまりwriter側でバッファに全部書き終わったらそのバッファをreader側のキューにいれる
reader側は全部読み終わったらwriter側のキューに戻す
っての
とにかく原則どおりまずシンプルにミスなく作って計測して最適化ね
reader 1
wrtier 1
だと思うけどそれならwait freeな実装が可能
read pointer/writer pointerで制御するやつね
かつかつに最適化するならこれ
しかしその前にどれだけの頻度と長さで排他の衝突するか見た方がいい
リアルタイムのオーディオなら短くても5msec周期とかじゃないか
かつlock中に多少のメモリの読み書きやってるだけなら排他が必要な時間は短い
なら素朴にmutex1個でのロックで十分な可能性も高い
同期のミスはデバッグがつらいから不用意に難しいことしない方がいい
もしくはある程度のバッファリング(遅延)が許容できるとか、固定長の処理であるなら
ならバッファを複数用意してダブル、トリプルバッファ的な制御でもいいだろう
つまりwriter側でバッファに全部書き終わったらそのバッファをreader側のキューにいれる
reader側は全部読み終わったらwriter側のキューに戻す
っての
とにかく原則どおりまずシンプルにミスなく作って計測して最適化ね
555デフォルトの名無しさん
2019/10/22(火) 17:19:01.36ID:mzkWHCb9 ringのソース見たけど
おれはm_full なしでやるのが好みだな
つまりm_front_indexとm_back_indexが一致するのはemptyのときのみ
full時には実際は1個空きがある状態
これを推し進めればwait freeの実装に近づけるぞ
車輪の再発明だが勉強にはなる
おれはm_full なしでやるのが好みだな
つまりm_front_indexとm_back_indexが一致するのはemptyのときのみ
full時には実際は1個空きがある状態
これを推し進めればwait freeの実装に近づけるぞ
車輪の再発明だが勉強にはなる
556デフォルトの名無しさん
2019/10/22(火) 17:21:45.79ID:2ZhQSHmS557蟻人間 ◆T6xkBnTXz7B0
2019/10/22(火) 17:29:01.30ID:QN5InCe0 まずは記憶媒体の性能を計測してみた。
https://github.com/katahiromz/YappyCam/blob/master/tests/diskrate/diskrate.cpp
https://twitter.com/katahiromz/status/1186558848393285633
これはSSDの場合だ。HDDでも同様に計測しないといけない。
https://twitter.com/5chan_nel (5ch newer account)
https://github.com/katahiromz/YappyCam/blob/master/tests/diskrate/diskrate.cpp
https://twitter.com/katahiromz/status/1186558848393285633
これはSSDの場合だ。HDDでも同様に計測しないといけない。
https://twitter.com/5chan_nel (5ch newer account)
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 ★2 [Hitzeschleier★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 【STARTO ENTERTAINMENT】timelesz篠塚大輝『大きな古時計』替え歌一発ギャグ「今はもう動かない おじいさんにトドメ~♪」が波紋 [Ailuropoda melanoleuca★]
- 【朗報】外務省局長、中国側の要求を断固拒否。「高市さんの答弁は日本政府の立場を変えるものではないし、撤回しない」 [519511584]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 外務省局長、よくわからないまま帰国へ [834922174]
- 【実況】博衣こよりのえちえち歌枠🧪
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- たまにaカップの女いるけど何を楽しめばいいの?
