C++相談室 part135
レス数が900を超えています。1000を超えると表示できなくなるよ。
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part134
http://mevius.5ch.net/test/read.cgi/tech/1516406742/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured >>802
attributes構文と紛らわしい。 C++のコストの大部分は例外に起因するらしい。
Cでコンパイルできるコードであっても、C++としてコンパイルするとバイナリが肥大化する。
その原因は例外。 x86-32だと割り込み発生時に対応出来るように
関数コールの度にスタックに情報を埋め込む
x86-64はこれが不要
割り込み処理がなければコストはかからない >>813
組み込み開発の株式会社○○みたいなサイトで読んだんだけどな。
なかなかためになる内容だったしブックマークしとくんだった。
見つけたらリンクくれ。 俺の見解では、例外にコストが割かれるなら、それは必要なコストだと思うんだよな。 元記事消えてるっぽいからアーカイブだけど
http://bytepointer.com/resources/pietrek_amd_x64_primer.htm
Windowsの例外機構がx64ではスタックベースからテーブルベースの通過するだけならゼロコストなものに変わった
ただしバイナリサイズは増える >>816
例外を使うならコストがかかるのは当然なんだが、
例外が通過しないかもしれないのにそこかしこで情報を積まないといけないのは良くないってことなんよ。
そんでまあ例外を投げたときだけにコストが生じる方式がいいよねっていう話。 例外が発生しない時のコストなんてゴミみたいなもんだけどな 64ビット化するとサイズが1.5倍になるらしいけどな。 今時コードのサイズなんて問題にならんだろ
その代わりに得るものは大きい 1.5倍って40sの可愛い少女が60sのオバはんになるってことではないだろか。
さあどっちか選ぶんだ。 どうしても対応し続けないといけない32bitのレガシーデバイスがあるなら頑張って
そうじゃなけりゃもう32bitなんて捨てろ 32bitがレガシーだあ?
どこで吹き込まれたか知らんが
騙されやすいやつだな クラスのconst配列メンバをコンストラクタで初期化するにはどうしたらいいでしょうか?
class A
{
const double array[];
void A( double &temp[] ) : array(temp)
{
}
};
これはコンパイルでエラーが出てダメでした >>828
できないからあきらメロン
素直にconst外してアクセサで制御するか、vector使うかしとけ
テンプレートとかを駆使して無理に実現しようと試みるのはいかにも頭が悪いし時間の無駄 constの問題というよりサイズが決まってないからダメなんじゃないの? ここ3年ほど32bitの組み込み機器に触ったことない 今はほとんど64bitの上で無理矢理32bit動かしてるんだよ
ネイティブ32bitCPUなんて化石 >>829
了解です、constは諦めマスカット
>>830
どんなサイズの配列が来るかはコンストラクタが呼び出されるまでわからないんで
サイズは未定にしておきました vc++のマルチコアのオプティマイズなんて甘々だから余裕で
勝てるけどなぁ。
あんなのに負ける人もいるって、世の中広いなぁ(棒) そりゃあ頑張れば勝てるだろう
コーディングコストと可読性の犠牲に見合うほど速くなるかどうかは別問題だがね VCもそうだけど大体のコンパイラは並列化や自動ベクタライズは強くないと思う
古くからある機能とそうでないものでは最適化に差が出るのは当然
だからこそSIMD使うときはみんなイントリンシック命令使ってるのであって >>828
template<std::size_t N>
class A {
public:
const double array[N];
template<typename ...ARGS>
A( ARGS&&... args ): array{std::forward<ARGS>(args)...} {}
};
template<typename ...ARGS>
inline auto make_A( ARGS&&... args ) -> A<sizeof...(args)>
{
return A<sizeof...(args)>(std::forward<ARGS>(args)...);
}
auto a{ make_A( 1.0, 2.0 ) };
こんな感じだろうか。
要C++11以降。
>>どんなサイズの配列が来るかはコンストラクタが呼び出されるまでわからないんでサイズは未定にしておきました
要素数が決まってないとコンパイル時に困るので、テンプレートクラスにしちゃったけれど… あーいや、 >>828 は配列を渡して初期化したいのか…
↑じゃだめだ
だいぶ別物になっちゃった。
ttps://wandbox.org/permlink/gUlWoKLb3QfigsQk 参考にしてみた
https://wandbox.org/permlink/3asRA3QSPQXmmn8l
C++17ならヘルパー不要にはなる・・・(コンストラクタに与えた引数から推定
けどどっちにしても配列数可変にはできない
ていうか配列の参照とか初めて使ったw >>828
C++14のinteger_sequence使ってみた
#include <iostream>
#include <utility>
template <size_t N>
class A
{
const double array[N];
public:
template <size_t... I>
A(const double (&temp)[N], std::index_sequence<I...>) : array{temp[I]...}
{
for (auto x : array) std::cout << x << std::endl;
}
A(const double (&temp)[N]) : A(temp, std::make_index_sequence<N>()){}
};
int main()
{
double t[] = {1.1, 2.2, 3.3};
A<sizeof(t)/sizeof(t[0])> a(t);
//A a(t); // C++17
} アンチパターンを生み出すための新機能が次々出てくるのがc++だ! こういうのからiostreamみたいになってゆくんだろうな つか引数にconst double(&temp)[]って何だと渡せるのこれ
()ないとエラー出るし 何も渡せないよ
配列数のない配列型はどんな文脈でも不完全型だからその型のオブジェクトは存在し得ない >>842
VS2017 15.7.1のVCのReleaseモードだとtemplateの部分が赤の下波線になるな
Debugモードにするとなぜか消える
そしてReleaseモードはエラーが出ているのにコンパイルして実行可能
バグじゃね >>847
仮引数として表れる場合はポインタに調整されるんじゃなかったっけ? 配列への参照ってのはあるんだけどね
template <typename T, int N>
N size(T (&)[N]) { return N; } >>848
> バグじゃね
未定義ならコンパイルできて実行できると言うのも規格に準拠してる正しい動作 >>854
見当違いのレスだな
DebugとReleaseでエディタの動作が首尾一貫してないって言ってるんだがな
15.7.2が来たから入れてみる >>855
普通の知能を持ってたら
> コンパイルして実行可能
に突っ込まれてることぐらいわかるだろうに... >>856
15.7.2にしたらReleaseでも赤い波線出なくなったぞ
エディタのバグが直ったようだ だから「エディタの」バグと書き忘れただけなのにお前らしつこいな
DebugモードでもReleaseモードでもコンパイルして実行できてたんだから 書き忘れとか知らんがな w
そもそもエディタのバグと言うなら三行目は元々不要
余計なことを書いて突っ込まれるとか低能にありがちな行動ってだけ >>859
気にするな。俺には>>854の方がよほど的はずれなことを言ってると思うよ。 >>861
>>856
同じようなレスを書いてループさせるのも低能にありがちな行動 未定義の意味を理解してないなら絡んでこない方がいいぞ エラー
警告
未定義
不適格
↑
混同するやつが後を絶たないな 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
V9EWM この文脈でエラーとか警告とか言い出す時点でアホ丸出しなんだが...w VisualStudioはインテリセンスとコンパイルに使うコンパイラが違う
ちょっと設定変えると、とてつもなくエラーが出るのにコンパイルは通るという事態は稀に良くある あるコンテナaとコンテナbを連結?するようなクラス(イテレータ)を作りたいんだが
イメージとしてはa.begin()からa.end()-1までいったら次はb.begin()になるようなやつを思い浮かべてるんだけど
どんな風につくればよいかアドバイスください >>871
concat_iteratorでググるとそれっぽい実装がチラホラ C++で2Dのwindowsで動くゲーム作ろうと思っているのだけど、ライブラリって何使えばいいんだ? windowsに限定するならopneGLにする意味は薄い DirectX tool kit なるものは一般的なDirectXの上位互換みたいな捉え方でおk? Siv3D とかも楽に使えると思う。 (3D という名前がついてるけど 2D もいける) 今の時代なら cocos 2d とかモバイルでも使えるライブラリ使った方がいいんじゃないのか string::size_type についてですが、
size_type の前についている
「string::」
というのは何ですか? >>893
ありがとうございます。
string::size_type は companion type というものらしいのですが、
この companion type とは何でしょうか? メンバ関数の引数や戻り値、メンバ変数などで使用するためにクラススコープで定義された型のこと
クラス(この場合はstd::string)を利用する側は、
実際にはその型がなんであるかを知る必要なく
文字列のサイズの型としてstring::size_type を用いることができる
参考
https://stackoverflow.com/questions/41471741/string-companion-types std::threadでサブスレッドで処理をしているのですが、処理をキャンセルするためthreadをdetachすると
メモリを破壊しているようで全然別の箇所で色々なエラーが出てきます。system_errorは送出されていません。
サブスレッドではnewでのリソース確保もしていないので理由がわからないです。
detachする際にはjoinableである以外に条件があるのでしょうか。 >>897
スレッドローカル記憶域とか破棄されたあとにアクセスしてんじゃないの? std::threadのdetachってスレッドを手放すだけでキャンセルはしないのでは
ラムダ式で処理を渡してるなら、ローカル変数の参照キャプチャとかしてるない? 一般にスレッドのキャンセルは難しいので適当に処理を終わらせてjoinするのが良いも思う https://ideone.com/3LDXGx
質問です。定期的に同じ関数をスレッドで起動するクラスを作りました。
んでコード中のここ無駄って書いてある行を削除する方法はありませんか。
開発はVCでやってますが、GCCでも通ればいいなーと思っています。 すみません。言葉足らずでした。
メインスレッド:GUI、サブスレッド:既存のライブラリでデータ補間の重い処理
を担当していて、途中でデータ補間パラメータを変更したくなった場合
キャンセルボタンを押してやり直す、という処理を考えています。
CPUは複数コアあるのでサブスレッドが走り続けてリソース開放が遅れるのは
構わないのですがjoinするとそこで処理終了まで待ってしまうのでdetachしたいわけです。重い処理のループの中にキャンセル用フラグでも用意できればキャンセル通知後
ループを抜けて速やかにjoinするところまで到達させる等の方法があるのですが、
既存ライブラリなのでそうはいかず諦めてdetachしようと考えています。
そのまま走り続けるだけだから結果を回収せずほっておけば良いのかと思ってましたが
甘かったみたいです。
>>898
thread_localは使っていないです。
>>899
アドバイスありがとうございます。関数オブジェクト作ってキャプチャは使っていないです。
>>901
スレッドを平和理に終了させる方法はなさそうなのでdetachできなければ諦めてjoinするしかなさそうですね…
とりあえず最小の再現例を作ってみることにします。 重い処理の方を別プログラムのプロセスにしちゃって止めるときはブチ殺すのがシンプルで良さそうに見える >>903
async つかえ。
wait_forっていう関数がプロミスにある。 レス数が900を超えています。1000を超えると表示できなくなるよ。