◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:C++相談室 part164 YouTube動画>1本 ->画像>5枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1683600652/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは
>>980 が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part163
http://2chb.net/r/tech/1672409791/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
>>2 よく見たらそれ乙じゃなくてポニーテールやん
class template みたいなノリで、namespace templateとかできないかね。 ユーザーカスタマイズくらいしかメリット無いけど。
ある整数のペアが既に出てきたかどうかを管理したいのですが、 安直に unordered_set(pair<int, int>> としたら、これはハッシュ関数を定義してあげないと 使えないんですね。 ネット上で見かけた良さげなハッシュ関数の例をコピーする手もあるのですが、 これ以外で楽なやり方(データ型)ってありますかね?
職業プログラマに聞きたいんだけど 自分でソフト屋なんて言ってるけど、ほぼ全てを外注に投げて自分ではろくに書けないなんての普通のことなの? 今年から社会人になったんだけど、先輩たちのレベルが低すぎて失笑してる日々です。 c言語、クラスという単語をドヤ顔で宣ってる先輩達。 classを解釈できるcコンパイラがあるのかな
俺は自分がそうだったら恥ずかしくてプログラマなんて名乗れないけど 世の中には色んな人がいるからね まあ俺の価値観では普通じゃない クラス、つまりオブジェクト指向は何言語を使うかじゃなく頭の中の考え方だから ++じゃないCでも使っていい用語だよ
>>6 ちなみにPythonだと辞書や集合にタプルをデフォで入れられるんですよね...
C++も同様のサポートをして欲しかった気が
>>7 板違い。マ板へ行け
あと5chは不満のはけ口じゃない。そういうのはママにでも慰めてもらえ
>>6 単に vector とかのコンテナに入れて find とかで既出判定すればいいんじゃないかな。
>>11 数が特に少ないときならそれでもいいけど
普通に考えたら実行コストが大きすぎるだろう。
ハッシュ関数を定義してあげないと使えないって 定義すれば使えるだろ 何が問題なんだ?
単にset<int, int>じゃダメなの?
場合によっちゃあmap<int, set<int>>のほうが容量ケチれそうだけど?
https://ideone.com/YB4CIY {
std::set<std::pair<int, int>> s;
s.emplace(1, 1);
s.emplace(1, 2);
auto f = [&s](int a, int b) {
return s.find(std::pair<int, int>(a, b)) != s.end();
//return s.contains(std::pair<int, int>(a, b));
};
std::cout << f(1, 1) << f(1, 2) << f(0, 1) << std::endl;
}
{
std::map<int, std::set<int>> m;
m[1].insert(1);
m[1].insert(2);
auto f = [&m](int a, int b) {
return m.find(a) != m.end() && m[a].find(b) != m[a].end();
//return m.contains(a) && m[a].contains(b);
};
std::cout << f(1, 1) << f(1, 2) << f(0, 1) << std::endl;
}
後者だったらstd::multimapでよくね unorderedでもいいけど
>>7 WNDCLASS
RegisterClass
UnregisterClass
WNDCLASSEX
RegisterClassEx
GetClassName
GetClassLong
SetClassLong
GetWindowClass
>>7 ソフト屋という大きなカテゴリの中でコーダーとは役割が違うだけでコーディングスキルだけを見て優劣を考えるのは短絡的な判断だよ
必要なスキルなんて立ち位置次第で全く異なるんだから
コード書けないリーダーは事務方に徹してくれるなら別にいいんだよ そうじゃないやつが迷惑ってだけ コーダーをバカにするやつはすべてこれ
>>13 よく使うものはシステム側でハッシュ関数を用意してくれると助かるな、的な
あともしショボいハッシュ関数を使ったら性能が落ちますし、ってそれも自己責任かw
>>14 setは悪くないですね。ただパフォーマンスにシビアになる場合はunordered_の方を
使いたいかなと。こちらもちゃんとしたハッシュが前提になりますが
>>21 >>22 片方の値をシフトして足すということですよね? 確かにアイデアですね
似たような感じでint -> intのマップをソートするというのを見たことが
何も考えないでboost::combine_hash使っとけばいい
いや、適当杉田わ long int v=0; for(auto c : int_array) v += v*12345 + c ; return v%hash_size;
いや、こうか long int v=0; for(auto c : int_array) v*=12345, v+=c ; return v%hash_size;
template <> struct std::hash<std::pair<int, int>> { static constexpr std::size_t size = sizeof(int) * 2; using result_type = std::bitset<size * CHAR_BIT>; result_type operator()(const std::pair<int, int>& val) const { result_type ret; ret |= result_type(get<0>(val)); ret |= result_type(get<1>(val)); return ret; } };
もとい ret |= result_type(get<0>(val)); ret <<= sizeof(int) * CHAR_BIT; //fix ret |= result_type(get<1>(val));
シフト演算が必要なのは、負の整数の場合が あと、問題のサイズによってはハッシュの速度も気になるなあと
この流れ… 小学生の頃の自分はもちろんc知らなかったけど このスレでああだこうだ言ってる人間達よりは使える人間だったのかなと
負の整数を論理演算と組み合わせるときはオフセットして非負の範囲にしてから符号無し型にして唐論理演算したら安心、 取り出すときは(論理演算して切り出した後)逆オフセットで元に戻る 全ての過程で符号つき整数の右シフトが陽に現れずに済む
しつれい >オフセットして非負の範囲にしてから符号無し型 この処理順序で良いのは {扱う整数|<std::numeric_limits<オフセットするときの整数型>::max()のときはこれで良いが、 =の場合は符号無しにしてからオフセットする 全てが調和する、
こんなの秒で解決するだろ ごちゃごちゃ言うようなものなの?
こんなの秒でスルーするだろ ごちゃごちゃ言うようなものなの?
ヒントじゃあかんのね 100%完全なコードを提供しないとクレームつくわけか # 若旦はん、やってて恥ずかしおまへんか?
教えてもらえないでしょうか c++で クラスを作って関数を書いています。 大きくなり、可読性が悪いので、 同じクラス内のcppを別ファイルに分けたいのですが、 可能なのでしょうか 継承を使って、10個ぐらい数珠つなぎにして、一番最後の継承クラスに関数呼び出し元の関数を書いて、 途中の継承クラスに分けたい関数を書いたら、 と考えたりしています。
>>39 可能
ヘッダのクラス定義はまとめないとだめだけど
cppのソースは分かれてても最後にリンクで辻褄が合えばOK
>>39 後半で言っていることがちょっと難しいかな
多重継承の数珠繋ぎを言ってる?
よく分からんけど多分そんな変なことしなくていいよ
>>41 >>42 助かります。ありがとうございます。
勉強してみます。
可読性が悪いものは ファイルを分けても良くはならんぞ
>>39 1つのクラスに機能を詰め込み過ぎなんじゃない?
昔、4万行のcppファイルを見たことはあるけどw
殆どコピペなんだろうな クラスの継承知らないヤツがよくやる荒業
そういえば C# でクラス定義を分ける機能 (パーシャルクラス) があると聞いたことがあるけど 本来的に分けるべきクラスを見かけだけ分割するような悪い設計を誘発しそうな印象がある。 C# について全然知らんので印象だけだけど。
partialはXAMLから生成された.csと手書きする.csをマージするための機能なので
分割されたそれぞれの断片をコンパイラの後工程で1クラスにまとめ上げる感じ。 なのでこんな感じの相互参照も許される。 partial class C{ private void F1(){ F2(); } } partial class C{ private void F2(){ F1(); } } まあ当然コードの見通しが悪くなるので、 コンパイラ生成が絡むとこだけをpartialにして1ファイル1クラスにしておくのが鉄則
「1ファイル1クラスにしておくのが鉄則」 10行のクラスも10000行のクラスも何も考えずに1ファイル 思考停止君のやること
C#のpartialは基本的に自動生成されたファイルとの分離が主目的 winformsのコントロールのプロパティのイニシャライズとか人から触ってほしくないファイルで一種の馬鹿避けになってる delphiではそのコントロール向けのファイルがバイナリでぶっ壊れてもどうにもできないし コーディング中にコード内検索も出来ない 利便性が著しくよくない 後は一般のコードジェネレータの吐き出すファイル用にも使える 最近はmvvm toolkitで便利に使われている コードの可読性が上がるし触られたくないものを扱うのも便利 人力コードで使う場合は長いファイルの下請けメソッドを分割する場合 単純に可読性が上がるけど普通は別のアプローチを使う 特定の機能をまとめたファイルを一つ作ってそこに関連クラスを全部入れるとかもできるけど無しだろうな 特定のタイミングでプリンターに出力するメソッドを追加してファイルのアリ無しで切り替えるとかは出来そう
おんなじ意味合いの関数なんだけどSFINAEしまくってて1000行くらいあるやつはよく見かける
触られたくないコードって危険を孕んで内科医? 業務の情報が1人の社員に独占されていると そいつが急死したら詰むだろ
彼も若いころは文脈も理解できてまともにコーディングできたのかもしれない 皆いつか老化して意味が取れなくなるんだから いつか行く道と言うことで…
互いに依存しないことを明確にするためにファイルを分けることはまれによくある…… static int g_foo; class A { ... }; class B { void bar() { baz(g_foo); A x; } // Bがg_fooやAへの依存が無いことはBをファイルを分けたらワカル分けなかったらわからん };
もっともファイルを分けたからといってもメモリのエイリアシング的な形で依存した場合は知らん some_func()が表記上はg_fooを含まないのに実は中でg_fooのアドレスを知っていて以下略
さすがに冷たい対応だったかなと C#でpartialが入った経緯 winformsはGUIデザイナを使ってボタン等のコントロールを自由に配置してプロパティを変えて表示される文字を変えることができる 初期はデザイナで変更するとformのファイルがそのまま変更された そのファイルを人間も書き換えているので人がミスしたり運が悪いと整合性が取れなくなったりしてた 例えば全置換などやってデザイナの部分も書き換わったりとか それで自動生成された部分を人が不意に触れないないようにそこだけを別ファイルに出す目的でpartial classが出来た partial methodも作られたけど他人が使ってるのを見たことがない
日本でパーシャルと言えばパーシャル冷蔵庫 微妙に凍結させた状態にして保存するというアレ まさにC#のpartialの事である
for(auto &v: createVector()) なんか処理 みたいな書き方してもcreateVectorは一回しかよばれず大丈夫ってことでいい?
>>67 せやで。
その関数が呼ばれるのは一度だけという解釈で正しい。
>>67 そんくらい自分で試しなされ
$ cat test.cpp
#include <iostream>
#include <vector>
using namespace std;
auto createVector() {
cout << "hoge\n";
return vector <int> ();
}
int main () {
for(auto &v: createVector()); // なんか処理
return 0;
}
$ g++ test.cpp
$ ./a.out
hoge
>>69 自分の環境だと通るのは知ってるけど、実は未定義でアウトみたいな場合あるから5chの有識者の意見が聞きたかった
かなり昔範囲forはプリプロセッサで展開されると聞いたことがあったなあ そういうのから誤解なんじゃないかな 実際展開してみたけどプリプロセッサでは展開されないです
>>70 これのこと?
std::vector<int> createVector();
for(auto &v: createVector()) // セーフ
struct Result { std::vector<int> v; };
Result createResult();
for(auto &v: createResult().v) // UB
>>71 range-based for は等価なコードを示す形で意味論が規定されてる。
https://timsong-cpp.github.io/cppwp/n3337/stmt.ranged 「こう書いた場合の挙動と等しい」という説明が「このように展開される」と誤解されたんだろう。
コンパイラの内部で実際に展開しても構わないんだが
プリプロセッサはフェイズの整合性がとれなくなるのでこの展開をプリプロセッサでは実現できない。
一時オブジェクトの寿命は個々の具体例を網羅的に覚えるというわけにもいかんので
ちゃんと原則を理解しないといかんというのは警告しておく。
>>72 で提示された内容を解説すると、このとき createResult の結果である Result は一時オブジェクトなので
完結式の終わりには解体される。 (
>>73 で提示した展開形を参照のこと。)
右辺値は参照で受けた場合に限りその参照の寿命と同じ分だけ寿命が延長されるというルールがあるので
その原則に従えば Result::v の寿命は延長されるのだが v を内包する Result が解体されるときにメンバも解体してしまうので
Result::v も無効になってしまう。
当然だがすでに解体されたオブジェクトはそのイテレータも全部が無効。
単純なFOREACHマクロだと展開できないんだよねこれ FOREACH(T x, iterable) "文" ↓ { auto&& range=iterable; auto&& begin=range.begin(); auto&& end=range.end(); for(;begin!=end; ++begin){ T x=*begin; "文" } } range寿命の関係上スコープの外に漏らしてはいけない。 FOREACHの終了を表現するために"#define FOREACH_END }}"とかの間抜けなマクロが必要になる (たぶんC++17で導入された初期化付きifを使えば誤魔化せるけど) セパレータの":"(or ",")をプリプロセッサを見つけるのが不可能。 Tでもiterableでも":"とか","を使って表現するケースに対応し切れない (Tにtypename std::array<int, 5>::value_type を指定されたら無理)
そうそう プリプロセッサは重複の無い任意の変数名を持ってこれない 固定でもスコープの問題もあるからプリプロセッサ論は馬鹿げてるなと思った
>>74 ちなみにこれはC++23からは解決する(P2644)
for文の中身のあらゆる一時オブジェクトは(謎の力によって)ループ終了まで生存するようになる
まあ現時点ではやらない方がいいし、気にしなくて良くなるまで10年はかかるだろうけど
>>77 えええ!
どんな需要を満たそうとしてそんな変更するんかね?
class Foo { int m_value; public: Foo() { m_value = 現在時刻に依存して決まる何かの値; } int v() const { return m_value; } }; int tmp; for (i = 0; (tmp = Foo().v(), tmp < 100); i++) { cout << i << "," << tmp << endl; } とかになったらどうなってしまウンダー/(;≧Д≦)\
for (auto&& x: <<ここだけだよ>>)
std::for_eachと死ぬタイミング合わせようとしてるのかな
do{}while(ここにblock内で宣言した変数使えるのマダ?);
Main でインスタンス化した、ファイル操作 クラスの設定を、別のクラスutilityの インスタンスで使いたい時ってどうしたら いいですか? ファイル開いておいて、デバッグ内容を そこに書き込みたい。 デバッグ終わったら不要になるんで、 あまりincludeとか変数とか増やしたくない。 VC++ のwindowsディスクトップアプリ です。
「ファイル操作クラス」ってなんのことか読み取れんが std::osteamのことか?std::ostreamを持ってる別の仕事があるクラスか? 差し支えなければ現状のクラス定義を貼ってほしいが
>>84 ファイル操作を含んだ、デバッグ用に用意した
クラスです。Debugクラスとします。
Debug dbg; グローバルで‥
WWinMain(){
dbg.initial(); 色んな初期設定。
dbg.filename(debugfile) ;
dbg.start(); ここで、std::ofstrm file.openしてる
dbg.writefile(“なんかかきこむ”);
Utilty utl;
dbg.closefile();
}
Class Utility{
この中で、mainの中で色々設定した内容で
(mainで用意したdbgインスタンスのまま。)
Debugクラス。使いたい。
開いたFileそのまま。。
}
こんな感じですが、伝わりますか?
std::ostreamはコピーを禁止してるから参照渡し(or ポインタ渡し)で受け取るのがいいかな class Utility{ Debug& _debug; public: Utility(Debug& debug) : _debug(debug) {} void f(){ _debug.writefile(...); } }; int main(){ ... Utility utl(dbg); }
Debugをシングルトン化しておけばいいのでは。 そうすれば、utilityもMainもDebugの定義を読むだけで、お互いに無関心でいられる。
#ifdef NDEBUG #define DEBUG_PUTLN(line) #else #define DEBUG_PUTLN(line) dbg.writefile(line) #endif
シングルトンって実質はグローバル変数そのものなんだけどな
int i をグローバル変数にしてたおじさん居たな 理由聞いたら書くの面倒だからとか
全部シングルトンおじさんとglobalおじさんは一人でもいると周りがめっちゃ迷惑やな
ありがとう。 やっばり、Utility の中にも色々書く必要あり ですね。 デバッグのためだけにUtility2 3 4全部直すのも と思ってたけど、諦めて頑張ります。
external でインスタンス渡して、 global.h さんだけincludeしてできないかなと、 甘く考えてた時もありました。
世界で1つのint iをブンブン回してるのクソワロタ
ループ内でサブルーチンとか呼んだときどうするんだろう・・・
std::u16string_view stringView (string); stringView = {stringView.data () + 1, stringView.size () - 1}; これの2行目はどういう意味なんでしょうか?何かの文法のような気がするのですが、調べ切れていません・・・。
グローバルなオブジェクトのコンストラクタの中からprintf()とかのC言語の標準ライブラリ機能が呼べるのはワカルが coutとかのC++の標準ライブラリ機能は安全に呼べることは保証されるの?
される 規格上はstdに含まれる値(オブジェクト)はユーザーコードで参照されたら(特別の規定がない限り)常に有効でなければならない
>>101 > stringView = {stringView.data () + 1, stringView.size () - 1};
↑これは↓こう書いた場合と同じ。
stringView = std::u16string_view(stringView.data () + 1, stringView.size () - 1);
>>106 たぶん直接的に表す用語は定義されてないと思う。
型の情報がないときは波括弧で表されたリストは initializer_list に推論されるけど
代入のときは代入演算子のオーバーロード解決時候補に関数シグネチャとして T& operator=(T&,T); が加わるので
結果としてこのとき生成される一時オブジェクトの初期化子という解釈になる。
Uniform initialization 一様初期化とか統一初期化?
https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html std::initializer_listも含んだ文法だね
std::initializer_listの方か他のコンストラクタの方になるかはけっこうルールがややこし
c++はその{}の中に書くとclassの中に書いた変数が順番に初期化される いろいろ問題があるから他の言語で採用されていない c++は実用面で利点があると判断されたのかそのまんま
>>105 ありがとうございます。
DTMのプラグイン(VST3)を作ってみたくて、それにはC++をある程度分かってないといけないそうなので、
参考書読んだりしているのですが、これれまでC++に全く触れてこなかったので、かなり面食らってます・・・。
サンプルのソースを見ても、いろいろな応用が含まれていて、前提となる知識がそれなりにないと分からないのかなと・・・。
>>113 C++ の仕様には未定義がたくさんあるので実際に動作させた結果から学ぶべきではないという事情がある。
ある程度は理屈で理解しておかないと簡単に破綻するよ。
実例を見ながら雰囲気で使うってのは出来ない言語だと思う。
しらない間に未定義踏んでて、コンパイラ変わったりしたときに挙動が変わるやつ
>ある程度は理屈で理解しておかないと に対しての >実際に動作させた結果から学ぶべきではない 極端じゃね?
>>113 chatgptにサンプルコードを解説させたら?
>>116 「ちゃんとした資料を読まずに動作から何かを読み取ろうとするな」という話なので、
資料を読んだうえで手を動かして確認することまで否定してるわけじゃないよ。
少なくとも初手は入門書くらい読まんといかんという程度のことを言ってる。
「ワイのコードではこう動いてるからいいの!」「ワイが試したらこう動いたからこうなの!」 で突っ走った結果大爆発する事例が後を絶たない
未定義まで行かなくても処理系依存とか未規定動作もあるからほんとにややこしい 知らず知らずのうちにコンパイラの拡張機能使ってたりもあるし 「動けばいいんだよ!」としか考えてないとどこで足元掬われるかわからん
>>120-121 そんな低レベルな奴見たことないけどな
居るには居るんだろうけど
あと逆にそういうのを「手を動かさない」「実用コードで試しもせずに机上の空論でマウント取る」ことの言い訳にしてる奴を最近よく見かけるのでな
実際VS2005ぐらいに演算の順番が決まってなくて実装依存だった それでコードを書いてた それがVS2007には演算順序が2005と変わってた GCCでも別の順で計算された どうしたらいいかわからんから多分ここに聞きにきたら未定義動作だからどうしようもない 実装依存で仕方がないと返答あり
自分もVCから別環境のclangに数万行のコード移したら未定義踏んでた部分あるけど、試さずにそれを最初から予知出来てたかというと無理がある どちらかのコンパイラのバグで通らなかったりおかしな動作する場合もあるんだし(特にテンプレート周りは多い) 書いてる最中でも疑問に思ったらすぐ調べる癖がついてりゃいいんじゃないかな
>>124 いや、文を分けて順序付けするなり、やりようはあっただろ。
>>126 上にも書かれてるけど既存のコードのどこで問題が発生してるか全てを特定できないんだよ
最近のVisual C++なら「コード分析」機能でコードの改良点を教えてくれるかも知れない。
AIが他人が書いたクソコードのリファクタリングやってくれると助かるな
超すごい!人間を越えた!とかワイワイさわがしいAIだが 実際にそういう感じの「マジに困ってる、やってくれたら本気で助かる」 ような事案は結局できない、という地獄
AIが人間並みの知性を持てば人間並みにエンバグしてくれるはず
責任転嫁するようになるまで人間に並んだとは認めない
会社で嫌われるイヤな奴の特徴を全てプログラミングされたAIとか?
AIに相談したせいで鬱になって辞める社員が続出しそうだな AIポイゾニングは新手のリモート攻撃として流行るかもね
質問ですがstd::stringに格納された数値文字列を数値にしたい、 しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい、と言う場合どうす れば良いの? ダチャい書き方ならできうるけど人類はいつまでstrtod()や&(str[0])…… std::string str; str ← なんか文字列入る char* end; double d = std::strtod(&(str[0]), &end); if (end == &(str[0])) { エラー } while (*end != '\0') { if (!std::isspace(*end)) { エラー } end++; }
文字列(char配列)とstringの仕組みはダサいけど他も大体これ さらにspanもいれる どこも大体同じ
しかしstodの「文字列が数値で始まる場合、数値化不可能な文字があっても例外は投げずに数値化出来るところまでの部分で数値化する」ってむしろ不便だよな。
charに変換して文字コード比較して範囲内外で変換分ける処理がシンプルじゃね
速度気になるなら二分探索の処理に追加してやればいいし
>>142 トークナイズするときに便利。
文字列が数値表現だけになっている状態を扱うことってそんなになくない?
なんらかの文字列から取り出す操作になることは多いし、
それを前提として考えたら自然な設計だと思う。
>>151 >なんらかの文字列から取り出す操作になることは多いし、
まさにそれやが
std::stod()ではどこまで読んだのかわからないから取り出せない……
仕様も確認できない奴が仕様に文句付けるとかお笑いだわ
勉強になるなぁ boost::lexical_cast ばっか使ってきた
>>154 仕様を確認して文句つけているのだから無問題
つか自分のスキルに合わせて仕様を変えてしまう香具師よりはマシ
つか初心者スレで今教えてもらったわサーセン;;; std::stod()の第2引数でどこまで読んだのかわかるのかそうか、、、
1e-3 0.4E+5 どうせ . とか + とか - とか e とか E が数字の後ろに来たらエラーにする糞オレオレ関数の出来上がり
fortran爺が1e-3を1-3と書いて送ってくるの辛い
charやwchar_tのうちは文字数くれたら別段間違うことは無いはず……
regex 使って、全角半角タブはreplace しつつも、正規表現で、数字だけ残して ってしたらいいのでは
ファイル名で並び替えるとき数字を文字列じゃなく数として判断して並び替えるの便利だよね。StrCmpLogicalWみたいなの
digitntegerみたいな関数なかったっけ javaと混同してるかもしれん
大文字小文字とか小数とか半角全角とか漢数字とかあるから闇が深い
アンダーバーの位置関係も結構罠だよね 文字コード的には 大文字<アンダーバー<小文字 だから
言語+コンパイラの仕様が拡張してるのにライブラリは貧弱なまま 自己流に実装してしょうもないバグが紛れ込む 関係ないけどstd::stodはC言語版と微妙に仕様が違うのだろうけどそんなの調べてない
例えばstodが解釈できる数値表現を正規表現でも解釈したいと思ったらどうしたら
std::sort (std::execution::par, v.begin(), v.end()); 上記で並列ソートできるとのことですが何並列なんでしょうか? もし環境に合わせて良きに計らってくれるのなら その良き並列数を取得する関数などありますか?
>>171 詳細は言語仕様では規定されていない。
リソースが不足していれば並列化されないこともあり得る。
並列化は大抵の場合に OS のサポートが必要だし
どういうサポートがあるかわからんので言語として明瞭な規定を決められない。
並列化される保証はないのにデータ競合が発生しないように実装するのは
プログラマの責任なので若干の理不尽さを感じなくもないが
C++ ってのはそういうもんなので……。
週末のレイトレーシングで1-17あたりをマルチスレッドにしてみたんだけど、ubuntu上でg++やインテルコンパイラだとスレッド数を増やすと逆におそくなるんです。windows上でvisualstudioでコンパイルすると、望み通りスレッド数を増やすほど速くなりました。何でなんでしょう?
>>173 >週末のレイトレーシングで1-17
全く意味がわからないんだが?
>何でなんでしょう?
お前のコーティングのせいじゃないか?
gccはね・・・どうも平行/並列処理には本気じゃないところがある たとえばstd::execution::parなんか真面目にやらんかこらって言いたくなる
皆さんレスを有り難うござます うちはstd::execution::parで効果絶大です $ g++ --version g++ (Debian 10.2.1-6) 10.2.1 20210110 Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
time コマンドで調べたメモリの使用量 (max resident set size) が理論値よりも多くて、原因を特定するためにコード内の各箇所でその時点でのメモリ使用量を出力できたら良いなと思います。 実行環境は Linux なのですが、どのようにするべきでしょうか?
あとメモリに関連した質問で、例えばめちゃデカい std::vector を要素数 1 に resize しても capacity はめちゃデカいままですよね? STL コンテナ以外にも、大きいメモリが割り当てられてるオブジェクトを使用後に破棄したいというケースがよくあります。 最も簡単なやり方は関数とか局所的なスコープとして切り出すことかと思いますが、他に、オブジェクトに割り当てられているメモリを手動で解放する方法があったら教えてください。
/proc/self/stat というファイルを覗きに行くか、 getrusage というシステムコールで取得することになるかな
>>182 そのために shrink_to_fit がある。
詳細は実装依存なので何もしない関数であっても仕様に反しないけど
常識的には各実行環境で効率的に動くように実装されるので
まずは試してみても損はないと思う。
アロケータを自作してもあまり制御できないんよね。
アロケーションが必要になったらコンテナからアロケータが呼ばれるという
受動的な構造なのでコンテナによるメモリ管理戦略にそれほど関与できるわけではない。
本当にどうしても標準ライブラリの挙動の詳細が不満なら
自分で同等のものを実装する (または望ましいものをどこかから見つける) しかないよ。
>>182 new で造って delete (または delete []) で解放
更にいうと、deleteはgccでは推奨されないのでptrを使うよりはstaticもしくはvirtualを使いましょうね。
>>182 >>185 とほとんど同じだけどunique ptrで管理。
ヒープの確保時間が問題になるならアロケーター使ってヒープを予約する。
>>182 vector<空にしたいオブジェの要素の型>().swap(空にしたいオブジェ)
>>188 vector<空にしたいオブジェの要素の型> hoge;
が既にあったとしたら
vector<空にしたいオブジェの要素の型>(hoge).swap(hoge);
で良いらしいけど副作用の心配無い?
>>183 ありがとうございます
> getrusage
を試してみようと思います
>>185-187 STL コンテナを使うとしても自作クラスを使うとしても、オブジェクトを unique_ptr で持つことにして要らなくなったら reset() すれば確保していた分のメモリを捨てられるということでしょうか
依存関係が絡み合っていて簡単に小さいスコープに分割できないときは試してみようと思います
>>189 その場合はメモリアクセス領域が変わるのでswapする前に取得済みだったイテレータは再取得する必要あり
>>191 「reset() すれば確保していた分のメモリを捨てられる」で間違いないでしょ。
>>190 resetする必要は無いよ。
コンテナから普通に要素を削除すれば、後はコンテナクラスがよろしくやってくれる。効率は実装次第だけど。
>>195 コンテナクラスがよろしくやってくれるのに任せるのであれば、スマートポインタで持たずに単にコンテナとして持つのと変わらないように思うのですが、違うのでしょうか。
ちゃんと理解していなかったら申し訳ありません。
vectorを信頼するなら単にclear()してshrink_to_fit()すればいい 信用できないならスマポで持っといていらなくなったら手動でブチ消せばいい それすら信用できないならイチから自分で作れ お前がどれだけ心配消化による
>>196 どのコンテナを使うかによる。
vectorとかdequeはまだ確保していない要素用の領域をしばしば予約するから、
>>182 のような状況を回避するのは面倒臭い。
listとかmapは(これも実装次第だけど)まだ確保していない要素のための領域を予約したりしないから、他のデメリットを許容するなら
>>182 対策の選択肢になる可能性はある。
いずれにしても、そこまで気にするならまずベンチマークを取って実態を調査すべきだし、そもそも巨大なメモリを頻繁に確保・解放するのは設計に問題があることが多いから、メモリを解放しないで済む方法を検討してみる。
>>198 そもそもvectorのスマートポインタ (あるいはより一般的にサイズが動的なクラスのスマートポインタ) を作り、そのvectorやクラスのサイズを変えたときって確保されてる領域のサイズも変わるんでしたっけ?
手動で変えなきゃいけないと思っていました
(また、vectorのポインタとvectorの先頭要素のポインタは意味が違うのでよりわけが分からなくなりました)
std::vectorはshrink_to_fit()呼ばない限り勝手にcapacity縮めたりしないはずだけど
>>199 コンテナ内のポインタの予約は避けられないよ。
ただ、ポインタのサイズを気にするようなシビアな状況なら、そもそもc++じゃなくてcで実装することを検討すべき。
シビアな状況でC++が使えないやつがCならOKなはずはない
>>199 何が判ってないのかが判ってないパターンだな
まともな解答もらってても何が正しいのか(なぜ正しいのか)
すら判断出来なさそうなレベル
解答者に失礼
他所スレで同じ様な流れが
>742
質問の仕方が悪いだけwww
欲しい情報を引き出すには一定以上の質問能力が必要
>743
質問の仕方が重要なのはその通りだけど
ここで問題にしてるのは自分が詳しくない領域では質問の仕方が悪かったかどうかも分からないってことでしょうよ
>744
>>742 質問のしかたさえ良ければ正確な情報が手に入ると思ってるのは素人だけだぞ?w
>>201 いや、ポインタのサイズなんて全く気にしてない。
質問は、メモリの解放をコンテナに任せるならわざわざスマポで持つ意味ないよね? ってこと。
で、コンテナに任せるというのは元の質問(
>>182 )への回答に全くなってないよね? ってこと。
(その理由は
>>184 ,200様の書いてくださってる通り)
つーかお前が何も分かってないのは
>>195 でreset()しなくて良いとかほざいてる時点でお察し。
>>203-204 笑
>>203 は
>>191 で「reset()しなくても良い」とかほざいてて
>>195 と同レベ。
>>183-185 ,194,197,200様
ご丁寧な回答をくださりどうもありがとうございました。
勉強になります。
>>205 コンテナのsmart ptrの扱いは調べた?
コンテナの要素とポインタの参照先の違いについて根本的な誤解がありそう。
vectorはまだ構築していないインスタンス用のメモリ領域を予約するけど、smart ptrはそんなことしないよ。
vector<smart ptr>もsmart ptr の予約はするけど、smart ptrの参照先インスタンスの予約はしない。
>>206 だから、結局任意のコンテナ、クラスに対してスコープ内でメモリを解放する方法は?
new で生ポを持って delete するか、スマポを持って reset するかだろ?
> vectorはまだ構築していないインスタンス用のメモリ領域を予約するけど、smart ptrはそんなことしないよ。
そりゃそう。
ゆえに、メモリを間違いなくリリースしたいなら reset すればよいのですねと
>>190 で述べている。
それで終わりなのにお前と来たら reset は不要だの元のコンテナの挙動に任せるだの、論旨を全く理解してないとんでもレスばっかり。
> vector<smart ptr>も……
論外。
誰もスマポのvectorの話なんてしてねえ。
186でも言ってるがstaticもしくはvirtualでデストラクタ使えよ それがシンプルで高速で1行も無駄のない設計な
182の >最も簡単なやり方は関数とか局所的なスコープとして切り出すことかと思いますが がコンストラクタで確保してデストラクタで消す話というのはわかってる上で >他に、オブジェクトに割り当てられているメモリを手動で解放する方法があったら教えてください。 なんじゃないの? そんなものは無いっていう答えもあるにはあるけどサ
最近IPP触り始めたんですが全部飽和演算で面食らってます Modulo関数は無いんですか?
>>207 ああ、ごめん。めっちゃデカイインスタンスのvectorじゃなくて、めっちゃデカイvectorね。
それなら実装依存だけど>184か、>192とか参照無効化の制限とかコピーコストとかあるけど>189。189はsmart ptrにしとけば実用上問題ないかね。vectorのイテレーターは保存するものじゃないし。
実際の所、vectorならclear()→shrink_to_fit()でメモリが開放されないこってありうるの?
規格上はshrink_to_fit()にメモリ解放する義務はないし、実装定義で何やっても自由(capacityを増やすような真似だけは禁止) shrink_to_fit()がなんにもしない実装でも一応規格準拠になる そんな糞みたいな実装が実在するかは知らない
>>211 はい結局一人だけ違う話してた
ハァァ~~~~~(クソデカため息)
>>212 基本的には効率的に実装されるものだと信じて良いと思うが
どういう実装が効率的であるかは実行環境の事情による。
たとえばメモリ管理がページ単位というのは普通のことだし
その場合にページ単位より細かく確保したり解放したりしても非効率になる。
常に何もしないというような実装はあまりないと思うけど
解放するほうが非効率だと考えられる状況では
shrink_to_fit を呼んでも解放しなかったり部分的にだけ解放する
ということはそれなりにあり得そうだと思うよ。
capacityと OS側からみた空きメモリはまた別かもしれんわけで アロケーターがOSからじかに要求してる場合もあれば OSへの要求回数を減らして内部でプールしてやりくりしてるのもあるし 制御したいレイヤーによっては全部自前でやるしかない という落ちにも
>>215 まぁ、細かい単位のメモリだったら、実際に開放されているかどうかなんて、ほとんど動作に影響しないとも言えるしね
(未初期化変数の不具合が発覚しづらい、くらいか)
とりあえずshrink_to_fitを呼んでおいて、細かいことは気にしないのが一番かもしれないw
「STLコンテナ以外にも」という文言が読めてない文盲さんたちがvectorの話ばっかしててワロ
「STLコンテナ以外にも」はSTLコンテナも含むということ STLコンテナの話をしても何もおかしくない
いつものことだが ほんの最初の数レスで終わってるのに どうでも良い脱線ほど盛り上がってgdgdレスでスレが延びる
>>182 良く読むと
>STL コンテナ以外にも、大きいメモリが割り当てられてるオブジェクトを使用後に破棄したいというケースがよくあります。
>最も簡単なやり方は関数とか局所的なスコープとして切り出すことかと思いますが
いやいやそもそも「関数とか局所的なスコープ(つまりautoだろ?stackだろ?)で大きいメモリ確保しようなんて思うな」って話なんだよな
ローカルなvectorを置けばヒープ確保されるので「つまりautoだろ?stackだろ?」は また何か誤解してる人が来たなとしか。
>>224 結論は>211にまとめといた。
resetは要らん。
>>223 「STLコンテナ以外にも」という文言が読めてない文盲さんたちがvectorの話ばっかしててωωω
>>226 「大きいメモリが割り当てられてるオブジェクトを使用後に破棄したい」なら
>185か>187。
>187はunique ptrの置き場所と解放タイミングによって解放の仕方が違って、自動変数にして関数やスコープから抜けるタイミングで解放するなら手動操作不要、vectorなどのヒープに置くとかスコープの終わり前に解放したいとかならreset()とかvectorの要素削除とかで手動解放。
いずれにしても、自動変数に巨大インスタンスを考え無しに置くのは悪手で、そのオブジェクトがスタックに巨大データを置かない(ヒープ等に置く)ことを確認してからにしたほうがいい。
>>216 vectorのcapacityはそのvectorが氏ぬかcapacity縮小アクションが生じない限りvector固有に占有されるから
capacity(のうちsize()を超える分)と OS側からみた空きメモリはまた別でケテーイ……
一方malloc()がOSからゲットしたメモリをOSに返さずにいるのはOS側からみた空きメモリではないにしろ
同一プロセス内の他のオブジェクトの構築に使えるのだから空きメモリのうち
これすらもOSに返したいということならこの流れの中で現状答えがでていないキモヌ
まあしいて言えばプロセスを一旦exitして再立ち上げ?
普通に作ったら(コードで明示的に直接OSのAPIでメモリを分捕って解放とかしない限りは プロセスのprivate bytesはプロセスが氏ぬまで増えることはあっても減ることは無いという印象、
>>225 スマンまじで理解できないのだけど、なぜvectorに限った話をしてるの?
回答者のレベル低いな~~~
こんだけダラダラ続けて、結局質問者
>>182 が
>>190 で早々に結論づけてることをリピートしてるだけw
アロケータ気に入らないなら自作くらいしろよポンコツ なにもかもSTLに頼りやがってそれでPGやってるつもりになるなよ
次世代の人は便利に使いこなしてるかより簡素になった仕組みを使うのだろう
>>231 コンテナの種類を問わない一般的な方法なんてものはないからじゃないですかね
以下のコードでaccumulateのとこでコンパイルエラーが起こります 何故か分かります? #include <iostream> #include <array> #include <deque> #include <exception> #include <numeric> using Vector = std::array <double, 3>; using Vector_Container = std::deque <Vector>; Vector &operator += (Vector &lhs, const Vector &rhs) { const auto size {lhs.size ()}; if (size != rhs.size ()) throw std::runtime_error ("Sizes are different."); for (size_t i {0}; i < size; ++ i) lhs [i] += rhs [i]; return lhs; } Vector operator + (const Vector &lhs, const Vector &rhs) { Vector result {lhs}; result += rhs; return result; } int main () { Vector v0 {0, 1, 2}, v1 {10, 11, 12}; Vector_Container c0 {v0, v1}; accumulate (c0.begin (), c0.end (), Vector {}); // コンパイルエラー return 0; }
>>239 レス有難うございます
まず訂正
-accumulate
+std::accumulate
全部は貼れないですけど大事そうなところ
In file included from /usr/include/c++/12/numeric:62,
from test1.cpp:18:
/usr/include/c++/12/bits/stl_numeric.h: In instantiation of ‘constexpr _Tp std::accumulate(_InputIterator, _InputIterator, _Tp) [with _InputIterator = _Deque_iterator<array<double, 3>, array<double, 3>&, array<double, 3>*>; _Tp = array<double, 3>]’:
test1.cpp:22:14: required from here
/usr/include/c++/12/bits/stl_numeric.h:141:46: error: no match for ‘operator+’ (operand types are ‘std::remove_reference<std::array<double, 3>&>::type’ {aka ‘std::array<double, 3>’} and ‘std::array<double, 3>’)
141 | __init = _GLIBCXX_MOVE_IF_20(__init) + *__first;
ADLでoperator+が見つからないからかな? struct Vector : std::array <double, 3> {}; みたいに定義したらいけるのでは
>>241 >struct Vector : std::array <double, 3> {};
>みたいに定義したらいけるのでは
通りますね
どういうこと?
std::accumulateが14行目で定義したoperator+を見つけれてないのが原因っぽい。 std::accumulateの第4引数に [](const Vector& v1, const Vector& v2){ return v1+v2;} を追加してやるとコンパイルは通る。 14行目のoperator+をstd名前空間に入れてやれば動くにゃ動くけど色々マズいので(調査する分にはいいけど)最終的な解答にはならないかな
>>242 たぶんC++コンパイラはoperator+の候補を検索するときに
Vector( = std::array<double, 3>)と同じ名前空間にあるものしか検索しない
Vectorのクラス定義そのものがグローバル名前空間にあるなら14行目のoperator+を見つけられるけど、
今はVectorの正体はstd::array<...>なのでstd名前空間しか検索しないんだと思う
>>243 ,244
なるほど解説頂きまして有難うございます
グローバルスコープはどっからでも見えて良さそうなものの
何でグローバルスコープの関数を探さないですかね?
独自のメンバ変数を持たないのなら継承してしまうのも手ではある(ただしコンストラクタやarrayを受け取るキャスト用コンストラクタとか書く必要が出ると思うけど) ただ、そもそもカスタマイズしたり自分の用途に本当に使いやすいものを作りたいなら、ちゃんと自分で全部書いた方がいいと思うよ
>>245 std::accumlateの定義内からだと、その下の方(ユーザーコード)で定義されてるoperator+は見えてないので、グローバル名前空間の探索では見つからない
>>247 std::accumlateが定義されているnumericをincludeする前に
以下のようにグローバルスコープにプロトタイプを置いても
同じようにoperator+が見えてないとエラーが出ます
using Vector = std::array <double, 3>;
Vector operator + (const Vector &lhs, const Vector &rhs);
#include <numeric>
accumlateは関数テンプレートだから実体化される時点でoperator+が見えてりゃOKのはず 言われてる通りADLで対象外なのが問題
>>237 (スマート)ポインタで持って要らなくなったら明示的にリリースする方法はあらゆるコンテナに対して使えるよね?笑
>>249 有難うございます
グローバルスコープに定義した関数が見えないのは
どうしてなんでしょうかね?
それでは全然グローバルじゃないような気がするのですが
規格を決めるときに何か意図があったのでしょうかね?
そもそもが名前空間内(よその演算子と混ざらないように)にある演算子オーバーロードを、外部からでも引数が合えば使えるように(std::operator+(a, b)とか書かないでいいように)するためのルールらしいから
外部の演算子見に行くのは目的に合わんのじゃね
std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、あまりよろしくないやり方しようとしてると考えた方がいい
(だから
>>246 のように書いた、継承したら一応arrayではなくちゃんとVectorクラスに対する演算子だから通る)
>>253 >std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、
>あまりよろしくないやり方しようとしてると考えた方がいい
なるほど
たぶんこういう考え方なんでしょうね
つまりvector<int>を使いなさいということ
実引数依存の名前探索、Argument-Dependent Lookup (ADL)は、 Koenig lookup とも言う 「Cプログラミングの落とし穴」の著者、 Koenigが、C++ に入れる事を推奨した ADLを知っているなら、かなりのプロと言える
演算子のオーバーロードなら、フレンド関数とか?
非メンバの演算子オーバーロード | Programming Place Plus C++編【言語解説】 第35章
https://programming-place.net/ppp/contents/cpp/language/035.html 状況を簡略化するとこう。 namespace ns { struct foo {}; template <class T> void bar(const T&) { T() + T(); } }; ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); } int main() { bar(ns::foo()); } ADL は「通常の探索に加えて」関連する名前空間も探索対象にするルールなのでグローバル名前空間も探索対象になるが、通常の探索では後ろで宣言 (定義) されているものは見つけることができない。 この場合はエラーとして検出されるけど、可視な宣言と実際の定義の集合に食い違いは未定義という解釈でいいと思う。 (ちょっと自信はない……。) だから順序を変えれば通る。 namespace ns { struct foo{}; }; ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); } namespace ns { template <class T> void bar(const T&) { T() + T(); } }; int main() { bar(ns::foo()); } 当然ながら std の (というかそれに限らず既存のライブラリの) 宣言の順序をどうこうするわけにもいかないので無理にカスタムしようとするのは筋が悪いということになる。
>>260 >だから順序を変えれば通る。
最近手元のg++を更新しまして10.2.1 -> 12.2.0になったんですが
前者のケースが通らなくなりまして疑問に思っていたところでした
10.2.1は寛容で両方とも通るけどC++的には後者のみ通るのが正しい?
>>261 前者はたぶん未定義かつ診断不要な状況なのでエラーを検出せずに通すのも正しい挙動で
プログラマがそういう状況を作ってしまうのが仕様に反する (というか結果が保証されない) という解釈になると思う。
template<typename Callback> void func(Callback cb) { //cb(1); // A //cb(1,2);// B } void f1(int){} void f2(int,int){} int main(){func(f1);} AとBをコンパイル時に呼び分けたいんですけど どのように記述すればよいか教えていただけませんか?
>>264 渡されたコールバック関数の引数の数によって区別するってこと?
素朴な方法だとオーバーロードするのが手っ取り早いと思う。
void func(void (*cb)(int)) {
cb(1);
}
void func(void (*cb)(int, int)) {
cb(1, 2);
}
void f1(int) {}
void f2(int, int) {}
int main() {
func(f1);
func(f2);
}
>>264 template<typename Callback> void func(Callback cb);
template <> void func(void (*cb) (int))
{
(*cb)(1); // A
}
template <> void func(void (*cb) (int, int))
{
(*cb)(1,2);// B
}
void f1(int){}
void f2(int,int){}
int main(){func(f1);}
265が言うようにis_invocable使うとこんな感じ? template<typename Callback> void func(Callback cb) { if constexpr (std::is_invocable_v<Callback, int>) { cb(1); } else if constexpr (std::is_invocable_v<Callback, int, int>) { cb(1,2); } }
>>269 これって関係ないif節はコンパイル時に消えるの?
>>269 ありがとうございます。
gcc 13.1.0 でc++17でうまくいきました。
後出しで申し訳ありませんが、C++14でかけませんか?
>>269 ,271
これは知らんかった
勉強になるなぁ
>>269 まさにこれをやりたかったです。
template<typename Callback>
void func(Callback cb)
{
// こことか
if constexpr (std::is_invocable_v<Callback, int>) {
cb(1);
} else if constexpr (std::is_invocable_v<Callback, int, int>) {
cb(1,2);
}
// ここをどうしようか悩んでいました
}
>>272 ,
>>274 ひとつの関数テンプレート中でやりたいってこと?
if constexpr が導入される前だとオーバーロードなり特殊化なりで
別の関数として分離しないと書けないと思う。
is_invocable に相当するものは自分で書こうと思えば書けるが
if constexpr は言語のコアの機能だからどうにもならんし……。
>>275 情報ありがとうございます
ご掲示いただいたコードで勉強になりました。
n抜けてたwコストがかかる演算なのは確かだけどw constexprマジック!マジック!
C++11のSFIANE地獄へようこそ
https://wandbox.org/permlink/2sfUVeEBrErqvI2R template関数の実体化が1つだけ成功して、
他が失敗するように仕掛ければ呼び分けは可能。
ただ見ての通り相当面倒なことを書かなきゃならない。
>>279 >>266 と本質的に何が違うのか分からない
解説よろしく
(templateでやってることは無駄なのでは?)
>>280 いや、
>>279 のほうがちょっと柔軟で使いやすい。
たとえば
void f3(long int, long int) {}
みたいなのを渡したとき
>>266 ではエラーになる。
引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと
厳密に int そのものでなければならないというのとでは制約の厳しさが違う。
templateでやるのは質問者の与えた要件だな 宿題なんじゃね、しらんけど
C++14にはif constexprが存在しないから template使ったオーバーロードしか手段がない 質問者がC++14環境でって言ってたからこんなクソ面倒くさいことやれば一応できるっていう例示
>>281 ,283
ありがとう
>引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと
>厳密に int そのものでなければならないというのとでは制約の厳しさが違う。
こういうことね
>>260 あー本来グローバルも対象になるのか、適当こいてスマソ
だが
>>248 で質問者が言ってるように、元のコードで順序を変えてもダメなのよ
何故か考えてはちみつのコードを以下のようにしたら同様に通らなかった
namespace ns {
template <class T = int>
struct foo{};
// added
struct hoge{};
int operator +(const hoge &x, const hoge &y) {return 1;}
};
ns::foo<> operator+(const ns::foo<>& x, const ns::foo<>& y) { return ns::foo<>(); }
namespace ns {
template <class T>
void bar(const T&) {
T() + T();
} };
int main() { bar(ns::foo<>()); }
すでに名前空間内に同名の関数があった場合はダメっぽい
あ、すまんfooがクラステンプレートになってるの直し忘れた(直しても同じだが)
>>285 名前探索 (name lookup) は狭い名前空間から探索していって
合致する名前があればそれより外側に同名の関数があっても
オーバーロード解決に参加しない。
わかりやすい例で言えばメンバ関数は非メンバより優先されるし、
メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。
void foo(void) {}
struct bar {
void baz(void) {
// この foo は bar::foo のこと
// 名前が見つかった時点でそれより外の名前空間は見に行かないので
// 引数が合わなくても他の候補は試みられずエラーになる。
foo(1);
}
void foo(void) {}
};
例をちょっと間違えたのでやりなおし。 void foo(int) {} struct bar { void baz(void) { foo(1); } void foo(void) {} }; こうすると非メンバ関数の foo は候補にすらならないという話。
g++更新にともない 自前ライブラリのビルドでエラーが出るようになって 悩んでたところを解説してくれてる マジで凄い人達だな
>メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。 thx。確かにこれ経験したことあるわ・・・ややこしいし名前変えて対処したけど
>>285 の例は using を使う形でも解決できる。 (設計意図によってはそれが妥当かどうかわからんけど。)
namespace ns {
struct foo {};
struct hoge {};
int operator+(const hoge& x, const hoge& y) { return 1; }
};
ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); }
namespace ns {
template <class T>
void bar(const T&) {
using ::operator+; // グローバルな operator+ をオーバーロード候補として参加させる
T() + T();
}
};
int main() { bar(ns::foo()); }
テンプレートを見る機会がよくあるなら std::begin を using している事例は見たことがあると思う。
C++って、こういう悪夢みたいなテクニックで溢れかえってるよなあ RustやらPythonだのに人気が移るわけですよ
カスタマイズされた関数が呼ばれるようにする綺麗な方法として customization point object という概念が近頃は導入されてる。
綺麗な方法というか汚い部分はライブラリに隠すってだけなんだけど。
真似してみてもいいかもね。
より綺麗な方法が導入されるのはいいんだけど、
過去の方法が消えてなくなるわけでもないし完全に置き換えられるわけでもないからなぁ。
個々には良くなっても全体としては余計に複雑になるだけってのもよくある話。
https://m.xkcd.com/927/ max RSS (メモリ総量) の取得ってWindowsとLinuxでポータブルな方法ないの?
C++標準ライブラリには無い 外部ライブラリに頼るか自分で実装するかになるけど、結局のところ#ifdefでOS依存の機能を呼び分けるしかない
std::uintptr_t get_available_memory(); とプロトタイプだけ用意して、定義を環境別に作るだな 内容的に割と単純な処理のはずで 環境別に用意といってもたいした工数にはなるめえよ
Nim いいよね C++ 嫌になったら Nim においでおいで
なんかのオブジェクトをポインタじゃなく実体として持ってるとして、それを delete するやり方ってないの? たとえば std::vector A に対して delete &A; みたいな
「実体を持っている」と言うが「誰が」持っているかにもよる グローバル変数として宣言しているなら予めメモリ上に確保されているから破棄は無理(強引に再利用はできる) スコープ内で変数として宣言したのなら必要なメモリはスタック上にあるからスタックを弄るしかない 別のオブジェクトのメンバ変数として宣言されているならそのオブジェクトを破棄する
A.~vector<>();でいいんじゃないの? メモリ解放が必要ならdelete(void*)&A;とかして。
>>299 deleteはdynamic storage durationのオブジェクトにのみ許される
std::vector<int> A;はautomatic storage durationの場合はその定義を囲むブレースから逸脱すれば破棄される
static storage durationの場合はプログラムの実行終了時に破棄される
thread storage durationの場合はスレッド終了時に破棄される
極論すれば、c++の変数は自動変数しか無いから、変数で定義しているものはコンパイラに任せるしか無い。
変数の生命期間よりも前に絶つのは new したものを delete する方法しかないよ std::vector* pA = new std::vector(); std::vector& A = *pA; : Aで操作 : delete pA; この後 Aに対して操作すると鼻から悪魔
auto&& A { *new std::vector<int>(0) }; delete &A; これで「実体」のように偽装はできるけど こんなコード書くやついたらグーパンだよ
>>305 極論すれば、と言っているだろ。
せめて反例ぐらい出せよ。
>>299 deleteで何をしたいかによるな
deleteは
・デストラクタを呼び出して
・メモリを開放する
という2つの動作が含まれるが、「メモリを開放する」に関しては、確保されてもいないメモリはもちろん開放できないが、
デストラクタは実体としてはただの関数なので、普通に呼び出すことは可能
ただし、メモリが開放される(deleteされる)時にもデストラクタはもちろん呼び出されるので、2重に呼び出しても大丈夫なように設計されたクラスである必要はある
Windows11でc++の開発したいんですけど開発環境何を選べばいいですか? ちなみに趣味でおもちゃ言語のコンパイラを書こうと思います
>>311 > 2重に呼び出しても大丈夫なように設計されたクラスである必要はある
trivial destructor 以外は(空の ~T() {} 含め)どうがんばっても大丈夫にはならず未定義動作となる模様。
https://timsong-cpp.github.io/cppwp/n4868/basic.life#9.sentence-1 >>314 visual studioでできませんか?
visual studioに依存しないような形で
>>316 依存するかしないかはプログラマが気を付けることだろ
>>316 つーか俺はVisual Studioを推奨する
コンパイラ本体が昔からしっかりしてるし
デバッガは無数の信者を抱えるクオリティ
俺はコンパイラは複数を利用するのが好ましいと思う。 気を付けてても処理系に依存している (または未定義を踏んでいる) こともある。 いくつかのコンパイラで試してみれば問題点を発見しやすい。 発現した問題についてはデバッガなりなんなりで追えばいいんだが、 問題が潜伏したまま表面に現れないってのは後になってじわじわ効いてきたりするし……。
>>299 デストラクタに直接リソース解放させるより
リソース解放用の dispose() みたいな関数を造っておいて
デストラクタから dispose() 呼ぶのと同時に
delete しないで dispose() だけ外から呼ぶ設計もあるよ
>>313 Code::Blocks (+ mingw)
コンパイラの本なにがいいのかオススメ聞いたらオッサンに聞いたら怪獣が書いてある本って云われて本屋行って買ったらあとで付録のFDD誰かにかっぱわられていタコとに気付いたけどその本一冊ではなんの役にも立たないクソみたいな本だったわ そのあとオライリーのyacc&lexの本と早乙女氏のBison&Flex本で学び直したわ
良く見たら全然違ったわw
yacc&lexが早乙女氏でBison&Flexが五月女氏でオライリーに似てるけどASCII出版やったわ
>>316 まず動くものを作ることに注力したほうがいい。
どうせ最初のコードは(問題領域の学習後に)捨てることになるから、プロトタイプと割り切るべき。あんまり頑張ると進捗悪くて挫折するし、うまく行ってもコンコルド効果で酷い目にあう。
>>310 確かに静的変数は自動だけど別物だな……よくやった。悔しいが褒めてやろう。
>>324 ???
storage duration は四種類の内の「ひとつ」であることは直接的に明記されていて解釈の余地がない。
https://timsong-cpp.github.io/cppwp/n4861/basic.stc#1 兼ねる場合は存在しない。
>まず動くものを作ることに注力したほうがいい。 +1票 >いくつかのコンパイラで試してみれば問題点を発見しやすい。 これはその通りだけど、もっともっと先の話
動くといってもHello worldじゃあまりにもモチベーションに乏しいから 何でもいいから目的目標を持ったプログラムを書いたほうがいい
>>327 この話題の大元である
>>313 でコンパイラを書くと書いてあるよ。
ドラゴンブックでは? 誤植を指摘できるくらい読み込めば古典は理解できてると思う
いつまでも初心者を抜け出せない人は初心者本を読み過ぎ
初心者本は【ど】初心者のうちだけにしとけ 謙虚なことはいいことだが、ここだけは背伸びしたほうがいい 初心者本で何か知ったら、それで禿本がどのくらい読めるようになったかやってみれ 禿本が普通に読めるようになったら次はISOの規格票
逆もしかり ISOの規格票であえなくギブしたら禿本 禿本でギブのとき初心者本に戻る感じな
特にC++は下手な参考書より規格の方が分かりやすかったりするからな…
初心者へのアドバイスに禿本とかいう隠語をつかうのはどうかと思う
今独学でC++学んでいるんですが、たまたま見つけたサイトでint32_tとありましたが int変数を宣言するのにint32_tなんて使いませんよね? intでokですよね?
>>335 32ビット長である必要があるときだけint32_tを使えばいいよ
>>335 int は言語仕様では少なくとも -32767 から 32767 を表現可能な幅 (つまり 16 ビット) を持つことが規定されている。
具体的な大きさは処理系定義であって、最低限である 16 ビットかもしれないしもっと大きいかもしれない。
扱おうとする値の範囲が 32 ビット分の幅が必要であると見積もったなら int32_t が適切なこともある。
ただ…… int32_t は「条件に合致する整数型を処理系が持っているなら必ず提供しなければならない」ということになっているので、逆に言えば 32 ビット幅の整数型を持たない処理系では int32_t が存在しないことが許される。
C++ は処理系定義ということにしている項目がたくさんあって移植性を考慮しようとするとすごく大変なんだが (プログラマが想定してさえいれば) ある程度に広く対応可能な仕組みとしてこういう回りくどいものがある。
初心者の内はとりあえず自分の環境で動くものを作れるようになるというので十分だと思うよ。
Bjarne Stroustrup著 The C++ Programming Language ISBN-10 4797375957
>>340 誰も知らないから隠語なんだよ
たまにいるよな、相手の知らないであろう単語を使ってマウントを取った気分になるやつ
>>340 検索すると別人の本が出てくるから駄目だろ。
C++でintと書けない理由はほぼほぼwindowsのintが32ビットと定義されているからで、 逆に言えば100% windowsで動かさないとあらかじめ分かっているならint使って書くよ
せいぜい数十までの整数でも、いちいちint8_tになんかしねえな
巨大な配列なら話は別だが単発の整数がレジスタより小さくても得なことが無いからな。
通信関連でペイロードに ビット長指定されてるのなんかは int○_t 使っときたい
四則演算では int より小さい整数は int に拡張する変換が入ることになってるし、 int を受け取る関数でも当然に変換されるので 変換する処理の分だけ素朴なコンパイラだと short のほうがコスト高になる可能性もある。
言葉足らずだったな 初学者向けに正確にいえば ビット数の低い数値の型にしたからといって 計算速度が速くなるワケじゃない 理由はハチミツ氏の記述通り
型のサイズが大きいほどキャッシュミスの確率が上がるし ベクトル化の効率も関わってくるから話はそう簡単でもないけどな
チューニングが必要になったら実測しろってのはそういうことよな。 やってみるまでわからん。
やはり64bitCPUなら64bit整数が一番計算が速かったりするのかな
>>348 al、ah、axと小さなレジスタでやりくりすることによりスタックすらも使わずに複数の変数を操作することは可能になる
まあ汎用レジスタ数の多い64bitアプリではあんまりメリットにならんが
普通、intは32bitじゃないの? 普通の計算に64bitなんて使ったらキャッシュ効率悪すぎでしょ
多少のCPU内の計算速度差より、メモリアクセスのペナルティの方が遙かに影響でかいんだよね 昔、同じテキスト処理をsjisとutf16で速度比べたら、処理が複雑なはずのsjisの方がわずかに速かったこともあった
ILP32 LLP64 windows: int32 long32 long long 64 LP64 unix: int32 long64 long long 64 ILP64 実装例なし
>>358 自作エディタの内部文字コードに悩んでるけどもしかしてUTF8がええのかな
>>361 utf8は日本語3バイトになるし、冗長コードの問題もあるし、処理がより煩雑になるから内部処理コードには一番向かないと思う
エディタなら素直にutf32(もしくは16)で持つのが良いような気がする
>>362 utf16はサロゲートペアがあるから避けたほうがいい。
簡単に実装するならutf32、メモリを節約するならutf8。だけど、utf8が覇権だからutf8にしたら?
今から新規にエディタ作るなら内部はUTF32一択でしょ それ以外を使う理由がない
>>363 サロゲートペアの判定は簡単だし、utf32でも厳密には1文字=1要素にはならないし、
メモリアクセス量との兼ね合いでより高速に動作しそうな気がするが…避ける理由がよく分からない
今どきは絵文字とかも絡んでくるから「簡単に実装」なんてそうそう言えないと思うんだよね 性別やら肌の色で修飾みたいな複雑仕様を網羅する必要があるから
Unicodeの処理なんてただでさえ魔境なんだから減らせる複雑性は減らしといた方が良いよ 悪いこと言わないからUTF32にしとけ
テキストエディタを自作すると一文字一文字の描画位置の計算を毎回しなければならず、結局全テキストをデータutf32形式で保持するのが楽という結論になりそう
>>351 変換する処理ったって、普通static_castにコスト発生せんやろ
static_castというよりstatic_cast相当というべきか もちろん浮動小数点数と整数だと命令いるけど
レジスタの拡張命令が必要になる それはゼロコストではない
8bit,16bitの値を同サイズのレジスタに読む それを32bitへ拡張する
8bitしかないのに32bitで読むと当然ごみが入るので何かしないといけない 逆に8bitだけ読んで何もしないとこちらもレジスタにゴミが残ってる 何もしないで使える場合なにかしらの仕組みがある そんなことするよりレジスタ拡張命令使った方がいい 通常の命令だけでなくてsimdにも用意されている
俺も
>>367 の意見に賛成。
UTF-32 の採用で何もかも良くなるわけではないが
少なくともコードポイント単位での扱いは楽になる。
ちょうど Unicode 関連の本を読んでたんだが 右から左へ書く言語だとか それが入れ子になってる場合だとか、 そういうのにちゃんと配慮したソフトウェアが世の中にあるのは めちゃくちゃ頑張った人がいるんだなぁと有難みを感じてる。
日本語も右から左に書く言語だ 正確には上から下と右から左ニダ
UTF32派の人ってWin32でW系API通す時に毎回変換するってこと?
>>381 そうだよ。
作るアプリケーションがエディタ (またはシーケンシャルではない
テキスト操作をする何か) であるという前提を置いているときなら
という条件付きな話だが。
そもそもWin32でA系APIにutf8渡せないし
渡せるという表現がまずかったかな 結果を気にしなければ、なんでも渡せるよ
>>384 Windows バージョン 1903 (2019 年 5 月の更新プログラム) 以降、ActiveCodePage プロパティを使って、プロセスのコード ページとして UTF-8 を使うように強制できるようになりました。
A系はASCIIなのでunicode由来のutfもshift-jis などのMBCSも扱えない
>>387 最近までは、-A API がレガシと見なされていました。
これは、何十年もの間、Windows が "Unicode" -W バリアントを推進していたためです。
しかし、最近のリリースの Windows では、ANSI コード ページと -A API を活用し、
新しい SKU で UTF-8 サポートを導入しています。 ANSI コード ページが
UTF-8 に対して構成されている場合、-A API は UTF-8 で動作します。
>>387 以前からCP_ACPは日本語環境でシフトJISを扱えたはず。CP_ACPの解釈をCP_UTF8にすることができる設定と見なせる。
ASCIIしか考えてないアメリカ人の作ったプログラムでもUTF-8ならそれなりに動くよね strlenが正確な文字数を返してくれるわけではないけども
WideCharToMultiByteとMultiByteToWideCharの第一引数に明示的にシフトJISのコードページ932を指定すればUTF-8な環境でも動く。
そうなの? ただ単に変換APIの第一引数に明示的にシフトJISのコードページ932を指定しただけだと とりわけWideCharToMultiByte()の場合、文字コードの自動判別が介在する余地もなく、 ウィンドーズ内部表現のUTF-16がシフトJISのコードページ932に(指定通りに)変換されるだけなんじゃないの…… M$のページ見たら >マニフェストの ActiveCodePage プロパティを使って、プロセスのコード ページとして UTF-8 を使うように強制できるようになりました。 >マニフェストの ActiveCodePage プロパティを使って と書いてあった マニフェストファイル変えたら中で何がどう切り替わるのかわ皆目わからんが、 ただ単に変換APIの第一引数に明示的にシフトJISのコードページ932を指定したら万事OKというよりは得心が行く
そういう話じゃない 〜A系のAPIの文字列引数にUTF8が使えるようになったという話だ
>>390 >strlenが正確な文字数を返してくれるわけではないけども
そもそも正確な文字数が必要な局面って?
そもそもUnicodeにおける「文字」って
A系ならstrlen、W系ならlstrlen使えば済む話では?
>>377 Unicode自体と同様、文句もあるけど世界中が規格化標準化されるのはやはり
有益な面があるなあと思ったり
言語を完全に知らなくてもそういう規則に従えばまあまあのものが出来る
そうやって自分もRTLなテキストを処理するコードを書いたことがあるし
日本語を(も)扱うコードだってどこかの外人が書いてるわけで
そうだ、日本語だって戦前はRTL。あれ、英語はどうしてたんだろ.... 敵性言語だから
ないことになってたのかなw
そういえば、テキストだけじゃなくてUIのレイアウトも変わるし、テキストのスクロール
方向とかも変わるし、注意が必要だったり
Visual C++してもいいでしょうか? 特定の既定のライブラリの無視に「LIBCMT.lib」を設定して マルチスレッド使っても大丈夫でしょうか? もちろんランタイムライブラリの設定はマルチスレッドにしてます。 これでマルチスレッド使っても大丈夫でしょうか?
>>393 何言ってるかわからんkwsk
過去にCreateFile(L"漢字.txt", ...)で作ったファイルを、
WideCharToMultiByteとMultiByteToWideCharの第一引数に明示的にシフトJISのコードページ932を指定するだけで
CreateFileA(u8"漢字.txt", ...)で開けるようになったとしたら論理鉄器におかしい希ガス
環境依存の文字コードを取り扱うA系の関数でコードページ65001(UTF8)をサポートしたという話か? 「最近のリリースのWindows」とやらが何年ごろの話か知らんが
>>396 英文モールスや和文モールス信号(符号)は戦前からあるから参考になるよ
みごとに被ってるから
>>399 お舞の方が何言ってるかワカラン
>過去にCreateFile(L"漢字.txt", ...)で作ったファイルを、
>WideCharToMultiByteとMultiByteToWideCharの第一引数に明示的にシフトJISのコードページ932を指定するだけで
>CreateFileA(u8"漢字.txt", ...)で開けるようになったとしたら論理鉄器におかしい希ガス
CreateFile と WideCharToMultiByte/MultiByteToWideChar には何の関係も無いぞ
どちらかといえば setlocale/systemlocale とかの話してるなら判らんでもないが
んまーもちついて
>>391 を読めば
>UTF-8な環境でも
というのがActiveCodePage プロパティを使って、プロセスのコード ページとして UTF-8 を使うように強制できるようになりました環境(
>>386 の意味なら分からなくも無いorz
>>403 >>396 はエンコーディングの仕方の話ではないんですよね
疑問の答えはここにあった(と思う)
組み込みの設計技法を学びたいんだけど、静的構造と動的構造の設計を学べるいい書物あったら教えてください
>>409 古い人間だから、デザインパターン本ぐらいしか知らん。
C++テンプレート設計の良本てあったっけ?
>>410 Modern C++ Designとか?
あれは魔術書過ぎてちょっと…C++03時代の本だから古いし
横からだけど組み込みは手続き型なのかイベントドリブンなのかも知らないので知りたいなw
組み込みだから手続き型とか 組み込みだからイベントドリブンとか そういうのはないよ
>>413 組み込まれていれば組み込みなんだよ。
扱う技術には何も違いは無い。
組み込みなら何らかの制御対象はあるだろうから
その制御対象の性質には影響を受けると思うが。
手続き型かどうかとイベントドリブンかどうかは関係ない概念
>>412 横からだが魔術書とか、アンサイクロペディアの内容真に受けてるのか流行ってるのか知らんけど良くない
凝ったメタプログラミングとかしなくても、わりと実用的な知識が書いてあるよ
オブジェクト指向だけだとユーザーに制約を押し付けてしまいがちな部分を、もう少し自由度高く、直交する概念を組み合わせて小さなパーツに分けるのにテンプレートが便利だよとかいう話が書いてある
出版当時の衝撃は魔術と評されるに値したなぁ 今もって難解の書ではある 正座して読むべし
>>417 いや読んだし持ってるし、面白くて良いことも色々書いてるのは知ってるよ
でも「設計技法の本だよ!」ってC++詳しくない人に薦めるような本ではない
C++03 と C++11 の間で大きな溝があるからなぁ。 言語を詳しく知った上でなら C++03 を前提として書かれた本でも 役に立つところを拾って読むということも出来るけど、 不慣れな内には薦められないというのはわかる。
メジャーチェンジの上って何て言うんだろう グレートチェンジ?
>>420 ああ質問者と勘違いしてた
ただ魔術書とか痛いし不正確な表現はよろしくない(実際Qiitaとかで価値の無い出典も示さないクソ記事書いてる奴がよく使ってる)と言いたいだけ
あと
>>409 が初心者かどうかはわからんぞ
>>422 新装開店と言いつつ中身は実質閉店詐欺sale
C++なんてもう20年くらいまともに使ってないんだけど大きく変わってるの? 普段使いするような部分で変わったのってどんなのあるの?
new deleteしない 生のポインタを使わない moveの意識
>>427 moveが一番大きいかな?
生ポインタは20年前でも使わない人は使わなかった
俺もムーブ (というかその前提である右辺値参照も) の存在が大きな差だと思う。 今となっては C++03 では右辺値参照なしでやってたってのが信じられんくらいだ。
右辺値参照とmoveでパラメータや戻り値などにclassのインスタンスを直接使いやすくなって、設計の自由度と安全性が格段に向上したとは思うけど、 その代わり、演算子のオーバーロード時のconstやexplicitの有無など、型推論の仕組みをきちんと理解して適切に記述しないとtemplateで訳わかんないエラーが出て、 初心者殺し度も格段に向上したよねw
まさに今20年前のコードメンテしてるからnew delete使ってるよ C++のランタイムすらリンクしてないからこれnewした時Win32APIの何が呼ばれてるんだろう?HeapAllocだったかな?
スタティックライブラリがリンクされてるんでしょ ランダム使用時と完全に同じとは行かないけどほぼ同等の処理のはずだけど
g++でVLAを使ってるんですが、宣言時に初期化リスト使うのって未定義ですか? 公式のドキュメントを漁ってるんですが見当たらないので(英語苦手なので見落としてたらすみません)
C++にはそもそもVLAないぞ 非標準で実装されるケースはありうるけどね
>>435-436 C と同等の VLA を使えるように拡張されている旨はちゃんとドキュメントに書かれてる。
しかし C の VLA では初期化子を書けないことになってる。
GCC の具体的なドキュメントとしてはここ。
https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html > Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C90 mode and in C++.
>>436 はい、処理系依存ということは認識してます
>>437 ,438
ありがとうございます!
数年前にc++でありながらvectorすらない実装はあったけど
CのVLAってスタック使われることもあるんじゃなかったっけか
どうしても VLA が必要だとしたら そもそもヒープアロケーションのコードを書いてるときとか、 変則的なアーキテクチャで仕方がないとか、 C++ の言語機能が完全には使えない状況かな。 あるいはヒープアロケーションのコストを許容できないほど速度的に厳しいとか。
話をぶった切る上に去年の話でアレなんだがこの件。
http://2chb.net/r/tech/1653135809/734 なんの気なしにログを見返してて思い出した。
unexec だ。
世の中には動的確保のコスト計算できない人が多すぎるんだ
>>433 ちゃうちゃう、 new deleteのソースアセンブラに吐かせたの見たらGlobalAlloc GlobalFree使ってるわ
さすがにGMEM_FIXEDだったけど
なんとなくメジャーなものをけなして気持ちがよくなってるんだろ 楽だよなそういうので気持ちよくなれる人は
メジャーだからって完璧に出来ているとは思わない方がいい
反体制派な俺すげーだろって痛すぎる厨二病は昔からいるよね
具体的にどういう場面で問題があるのか、可能ならサンプルコードなどを添えて指摘してくれないと、同意しようがないよね
そりゃ様々な用途や優先すべき軸がある中で汎用的にあらゆる用途に高性能であれと言われたら 中庸にするか尖らせて特定用途で使い物にならなくなるかの二択になるよね
EXEで確保したしたメモリーブロックをdllで解放するときに(そんなことをするなというのはさておき むしろmalloc()だとリンクするCRTのバージョン相違でトラブルになりかねないから OSがmalloc()的なことまでしてくれるのは良い事な希ガス知らんけど
C++ なら operator new のオーバーロードなんかも出来るわけだし コンテナ類もアロケータを差し込むことが出来るわけで メモリアロケーションに関して過剰なほどのカスタマイズ性がある。 もちろん提供されるアロケータで性能が足りるならそれに越したことは無いが、 足りないときでもなんとかできる可能性があるってのは C++ のいいところだよ。
前なんかstd::vector<T>をdllに渡したら(コピー渡ししたら)クラッシュするトラブルに遭遇して 原因はC++のランタイムのバージョン相違やったorz
DLL を跨ぐときは生配列が結局は楽かなぁ。 他環境に移植する予定がないなら COM の流儀に従って SAFEARRAY とか。
アロケータを指定するときってのは性能どうこうではなく環境や設計上の理由が主だよ それよりpolymorphic_allocatorはなんでコンテナのコピー時にget_default_resourceを返すんだマジで
10年くらい前だけど6コア(12スレッド) x 双頭のマシンで Debianのlibcのmallocをjemallocに置き換えたら かなり速くなって感動したなぁ いまのglibcのmallocはどうなんだろ?
最近クラス作るのが面倒な時thread_localのstd::vectorよく使うんだけど 何か問題起きたりする?
問題を検証するコードを書いて実験してみれよ 一日で組めるだろ
1日で組んだコードも合わせて技術ブログに記事を書くところまでがセット
よく使う割に問題が起きてないならそれは問題ないのでは 証明終わり
>>465 std::vector 型の変数がスレッドローカルとして定義されること自体は問題を引き起こさない。
スレッドローカルな変数はスレッドの生成・解放と同じタイミングで生成・解放される普通の変数。
それで問題が起こるなら単にプログラムのロジックに誤りがあるってだけ。
「クラス作るのが面倒な時」と「thread_localのstd::vector」の関連が見えないな。
>>741 std::thread は関数オブジェクトを受け取ることが出来る。
スレッドに固有、かつそのスレッド全体で使うようなデータは
その関数オブジェクトが所有するのが常道のひとつ。
しかしスレッドローカル変数もスレッドの寿命と一致する形でのデータ置き場になる。
そういう意味で代替品であると見做すことができる。
という話だと私は解釈したが、 std::vector がどこから出てきたかはわからん。
そもそもの知識がないからpythonみたいにリストにぶち込んで インデックスですべてやろうとかそんな話かとオモタ python界はすごいぞ クラスに変数など作らずすべて辞書にぶち込んで使ってたりする
a = {} a['taro'] = {"name":"太郎","age":25, "sex":"男"} a['hanako'] = {"name":"花子","age":18 ,six":"六"}
if a['taro']["age"] ==a['hanako']["age"]: これって全然コード補完効かないから脳が死にかける
name="name" age="age" sex="sex" six="six" とかしたらいいんか if a['taro'][age] ==a['hanako'][age]: 嫌すぎる
プログラマではない人間もユーザー層として存在するし Python はそういう人間にもリーチしてしまったから 割合としてワヤなものもできやすいというのは理解できる。
a['taro'] = {"name":"太郎","age":25, "sex":"男"} だけ見るとjsonなのかとも思える
あるクラスにあるクラスのコレクションを抱かさせてるなんて良くあると思うけど その際に外部からそのコレクションを参照したい場合、どうするのが定石なの? class Datas {private:std::vector<Data> _datas;}; publicにするとか、std::vector<Data>::iteratorをpublicにするとか const Data& operator[](int index)をpublicにするとかいろいろあると思うけど
今日本屋で○○データムと言う本があった DATAの単数形がdatumと言うことにこだわる大人って理系だけなんだろうなと感じたらこれだよ 即出て来た
datumに拘ってるのではなくdatasなんて言葉はない
そこか、英単語をぐぐったら解決しました。 ありがとうございました
>>481 場合による。
見せる相手が最初から限定的であるような場合はフレンドを宣言すればいい。
コンテナ系クラスとかは内部的にはたぶんノードを表すクラスとか
も使ってると思うけどそういう感じで密接に関連がありつつ
他では使う可能性がないような強い関係性がある場合はフレンドにする。
データを保持するためだけの汎用クラスとして定義するならデータメンバは public にしてもかまわない。
std::pair とかはそうなってる。
もうちょっと疎結合にしたいときなら許したい操作だけをpublic なメンバ関数として公開すると思う。
既存のクラスを使いつつ外部に公開するのはサブセットにしたいという場合なら
プライベート継承した上で公開したいメンバだけ using するという方法も取れる。
#include <iostream>
#include <vector>
struct Data : private std::vector<int> {
using std::vector<int>::vector;
using std::vector<int>::operator[];
using std::vector<int>::begin;
using std::vector<int>::end;
};
int main(void) {
Data foo = {1, 2, 3};
for (int x : foo) {
std::cout << x << std::endl;
}
}
>>481 privateメンバなのだから
できるだけ外部からそのコレクションを参照しないように設計するべきだと思うよ
どうしてもってならiteratorではなくconst_iteratorにするとか
あなたが書いてるようにconst Data&を返すaccessorを実装するとか
"HogehogeData"という名前で定義されたプログラム上の存在があったら その複数形はHogehogeDatasと呼ぶしかない 気持ち悪くてもしょうがないんだよ
ファーストクラスコレクションにしないならその実装は不要だ 基本的に存在意味がない
ワイはプログラミング言語 Scheme を使ってるんやが Scheme の仕様には datum という語が出てくる。 シリアライズの単位に関する概念なのでリストひとつも datum と (つまり単数形で) 呼ばれるのが ちょっとモニョッとする。
どうでもいいことを突っ込んでる人いますけど Datas=>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Data=>aaaaaaaaaaaaaaaa と置換してください
hogehogetoyukainanakamatati で解決
powershellはJSONやxmlをその構造のまま扱えたりオブジェクト(PSCustomObject)にも変換できてpythonなんかより小奇麗に書けますよっと
>>478 だとif ($a.tsaro.age -eq $a.hanako.age) { ... という具合
powershellはC#とシームレスに連携する手段もあってpowershellで苦手な再帰処理とかをC#コードに逃がしてpowershell機能を使いたい部分はActionやFuncから呼び出す事もできますよっと
よく見たらここC++スレだね 俺の事は忘れてください
質問なのですがclass Datasというクラスがあってstd:::vector<Datas> vec((size_t)100); であるときに vec[k]の場所にn個の場所を空けたい(値は初期化済Datasオブジェクトなら何でも良い)場合どう書くべき? やっぱ手動でsz = vec.size(); vec.resize(sz + n);して既存要素vec[k..sz-1]を後ろ(vec[k+n..])にコピーする --- (1) のが最速? 仮にstd::vector<T>::insertを使うと Datas x; // (A) vec.insert(std::next(vec.begin(), k), n, x); // (B) になると思うのですが、なんか(A)で不必要にオブジェクトを1個構築せねばならないのと (B)で多分デフォルトコンストラクタではなくコピコンがn回呼ばれるのちょっち嫌 (なぜなら(1)のコピーとn個分の場所の確保に加えて、xをn回コピーするという余デフォルト構築よりも遅そうな処理をするから
>>497 resize だって再配置 (に付随するコピー) の可能性はあるんで
どっちでも大差ないんじゃないかな。
楽だと思うほうで書けばいいと思うよ。
>>497 無駄なデフォルトコンストラクタやコピーを削って極力ムーブで済ませようと思ったら
sz, k, n の大小関係ごとに場合分けして move_iterator 経由の insert とか使い分ければ
いけそうだけど、面倒なわりに見合うほど効率改善しそうな気はしない。
書き込みはそこまで遅くないから労力に見合わないだろうね
リアルタイムOSのタスクのように無限ループが前提のとき TASK Task1() { while(1) { Obj1 obj = Device::GetObj(); : : } のようにobjを使う場合に、GetObjが内部でnewされていると、この作りではいつかメモリ不足になってしまいます。 そうなると自作でないクラスのメソッドは使う前にnewの有無をすべて調べなければならなくなるように思います。 実際はそんな不条理はないはずで、このような問題はどう対処するのがいいですか。
>>502 自作でないクラスのメソッドは使う前には
メソッドが消費するメモリを見積もらなければなりません
不条理でも何でも無い
自作でないクラスでも使う関数がメモリ動的確保するかどうか普通は確認するぞ
>>502 >GetObjが内部でnewされていると、この作りではいつかメモリ不足になってしまいます。
この懸念は普通の作りなら基本的に無用。基本的に問題無い
(1) Obj1という型がポインタやハンドルではなくクラスの場合:
objはwhile(1) { }のブロックの中で構築されるので
ループの終わりでデストラクタが呼ばれる(破棄される)から、
Device::GetObj()が真っ当な作りならnewしたポインタをObj1のインスタンスobjに引き渡し、
Obj1クラスが真っ当な作りならobjが破棄されるときに引き渡されたポインタをdeleteする(ように作る
からダングリングポインタは生じない(ようにできる
(2) Obj1という型がポインタやハンドルの場合
確保したポインタやハンドルはいずれクローズせねばならない。
ループが次の繰り返しに入る前に確実にクローズすればよい
基本的に、というのは(2)のケースで例外が生じたときクローズされずに抜けてしまう危険性があるのと、 (1)のケースにおいてもobj1の構築中に例外が生じた場合はきちんとデストラクトされない危険性がある。 Obj1のメンバがnewされるべき生ポインタの場合はこれは対処不能。生ポはやめてスマポにすればおk 詳しい話ははちみつ餃子氏に聞くと良い(マテ
訂正orz、
誤: ループの終わりでデストラクタが呼ばれる(破棄される)から、(
>>506 正: ループが次の繰り返しに入る前かループを抜ける際にデストラクタが呼ばれる(破棄される)から
>>502 必要ならそのGetObj()とやらのドキュメントにDevice::ReleaseXyz()とかDevice::ReleaseObj(obj1)とかobj1.release()とかを後で呼ぶように指示されてるはず
それを怠ってリークさせたならお前がタコ
そういう指示がないくせに勝手にリークするならそのライブラリがタコ
そんだけの話
そして使い方がドキュメント化されてないなら組織として問題がある。 が、そういう話はマ板で。
皆さんありがとう。
>>506 ブロックスコープは知りつつも、ループのブロックの場合はループ中は寿命が継続すると思っていました。
ループ時に毎度後始末されるなら安心です。
組み込み用途のライブラリで毎回ループ終端でデストラクタが呼ばれるように普通は設計しないから大丈夫 疑わしいならベンダーに問い合わせるかライブラリのソースを読めば解決
ちょいとコイツを見て欲しい。MSVC 14.36.32532でC++17かつセキュリティチェック無効(/GS-)
最小コードで再現するために、コマンドライン文字列を変な形式として扱ってるのは置いといて
変数rSizeが、引数argcのスタック領域(ebp+8)に割り当てられるんだけど、こんな最適化ある?
確かにargcは用済みだが、レジスタやローカルスタックではなくcdeclのconst引数にストアする?
そんなことよりbooost向けの技術書について教えてくれ
そんな最適化あるよ。長期に渡って解析やってたらときどき出くわすよ。
ADLについて初めて知ったのがboost::mathだった懐かしい
観測可能な範囲で規格通りの挙動をする限りは、コンパイラ様はどんなバイナリを吐こうとどんな風にメモリやレジスタを扱おうと自由なのだ
if文の条件式のところにがっつり文が書かれてゐる 最後の式の値が結果、とかますますPerl的世界に…… そのうち値を返す関数もreturn書かなくて良くなったりして……
>>519 任意の文を書けるわけではなく単純宣言に限られる。
うん。なんか「見てくれ」とか言うから見たけどサンプルとしてもしょーもないコードだなと思って 一度コメントしかけてやめた windowsのxx仕様 独自mainとか
自分が本当に答えを知りたいんじゃなくて、フレームというか、言い争いを起こして面白がりたいのかな、とか
やっぱ
void foo() {
for (int i = 0; i < 100; i++) { .... }
for (int ii = 0; ii < 100; ii++) { ... }
...
for (int iiiiiiiiiiiiiiiiiiii = 0; iiiiiiiiiiiiiiiiiiii < 100; iiiiiiiiiiiiiiiiiiii++) { ... }
}
とかあってどのfor文でもループ変数のアドレスをとるような式が書かれていなかったら
ローカル変数i、ii、...、iiiiiiiiiiiiiiiiiiが違うアドレスでなければならない理由は何も無いから
同じアドレスに割り当てになる可能性は高いと思う
でデータフロー解析するステップではもはやブロックの構造とか渡ってないから
そういう芸当をする同じロジックが
>>514 のようなことも当然するキモス
※ 個人の感想です
ていうか補足、
void bar(int& x);
というのがあって
for (int i = 0; i < 100; i++) { bar(i); }
for (int ii = 0; ii < 100; ii++) { bar(ii); }
for (int iiiiiiiiiiiiiiiiiiii = 0; iiiiiiiiiiiiiiiiiiii < 100; ii++) { bar(iiiiiiiiiiiiiiiiiiii); }
だった場合はこれは明示的にループ変数のアドレスをとっているわけではないが、
アドレスをとっているのと同じことなので
i、ii、...、iiiiiiiiiiiiiiiiii同じアドレスに割り当てになる可能性は無くなると思う
よかったなあ
>>514 、
しかしわからんのは void bar(const int& x); // const ! だった場合は for (int i = 0; i < 100; i++) { bar(i); } for (int ii = 0; ii < 100; ii++) { bar(ii); } for (int iiiiiiiiiiiiiiiiiiii = 0; iiiiiiiiiiiiiiiiiiii < 100; ii++) { bar(iiiiiiiiiiiiiiiiiiii); } だった場合はi、ii、...、iiiiiiiiiiiiiiiiiiが同じアドレスに割り当てられ得るのかどうかわわからん……
スコープを抜けたローカル変数であれば順当な割り当てに思えるのだけど
>>514 が差し支えるのはコードインジェクションで引数を使い回すとかの横着
さりとてトップレベルのconstやvolatileは関数シグネチャに現れない訳で
cdeclであろうと引数の寿命は関数を抜けるまでだろうから極めて妥当なのか?
14.27.29110ではやらず、スタック量は逆に増え…増えたから節約してるのか
rbp+なら…いやそれも引数用スタック。C++20でvolatile非推奨化は有ったが
volatile引数への代入も引数スタックへの書き込みと思っちゃならんのかな
>>527 言いたいことがあるなら独り言を書くんじゃなくて説明しろ。
>>528 どの部分ですか?rbp+のくだりならx64であればシャドウストアを呼び出し元が確保する事になっているので
引数へ代入以外でもrbp+に書き込まれるが、それにしたって引数の退避以外で行われるかという意味だけど
またこの最適化が適正だとすれば引数へconstを指定しても
それは引数の格納元が書き換わらない事を意味しない訳で
volatileにしても引数スタックと同一視は出来ないのかなと
とりあえずcallee-savedとcaller-savedあたりでググってこい
>>529 技術的な意味合いじゃなくてね、
それをのべてどうしたいのってことだよ。
疑問なのか?主張なのか?感想なのか?
これだけは言っておく 文章が下手糞はプログラミングも下手糞ってことだ
久々にヤバい変数名を見た
>>525 このクソみたいな変数名はおまえが考えたのか
>>533 母語で説明できないようならプログラマには向いてないとかいう意味のことをダイクストラが言ってたな。
普通の人は母語が最も得意なはずだからそれで表現できないのに
プログラミング言語でなら表現できるってことはないのは道理というものだ。
二、三個違えて大域変数切って火に油注ぎたくなるやつ
さんざん言われてるけど質問文きちんと書ける人はChatGPTで自己完結しちゃうんだよな
ゴメス
>>524 はリリースビルドしたら全部同じアドレスになったわ;;;
やっぱ握った変数なりオブジェクトなりのアドレスを
その変数なりオブジェクトなりの寿命が尽きた後に
使おうとするのは未定義動作であることだなあ、
俺には
>>524 がなんでそんな結論になるのか分からんのだが
for内で i を宣言してるんだからfor のスコープを持つローカル変数だろ?
int が4バイトの前提で言えば for 突入時に int i をスタック上に確保(スタックポインタを4バイトマイナス)して for 離脱時に int i の領域を解放(スタックポインタを4バイトプラス)する
この繰り返しなんだから int i や int ii のアドレスが同じになることに疑問を挟む余地がないと思うんだけど
何がおかしいのか俺にはさっぱり分からん
for の i がローカルになったのは最近 グローバルに盛れるコンパイラ環境は巷に溢れていた
#define for if(0) else for
間違えた #define for if(0) {} else for これでゾンビiよく消してた
>>544 ごめん、まじめに教えて
これ何の意図?
これに意味がある具体的なコンパイラって何の何version?
VC++6.0という大昔にデファクトスタンダードだったコンパイラだ
例外飛ばすと自動変数の破棄全部ふっ飛ばして戻ってくる酷いポンコツだったな よくこんなの皆つかってたなというかコレしかなかったからな
>>545 for の初期化節で変数宣言した場合にその外側のブロックがスコープになるコンパイラが存在し、
その対抗策としてこういうマクロを導入するという方法があったという話だろ。
>>547 意味がわからないなら知らなくていい
当時を知らないなら理解しようとするだけ無駄というもの
>>549 ありがとう、そしてありがとう
>>548 VC6がポンコツは同意。
あのころMSはディンカムウェアからstd c,c++ ライブラリを買って導入してたけど、そもそもc++の仕様準拠がメチャクチャだったと認識してます
もうVC使わなくなって長いので気にしなくなった
『for内スコープ』の仕様にvc6は未対応だ、という事実を認識し 責任者がvc6を選択した案件で納品する なら、その条件に従って書く(つまらないつまづきに繋がる書き方を避ける)のが他者に対して親切な技術者だと思うが 「そういう話はマ板で」か
>>551 言語仕様が改訂されたんだよ。
C++98 が成立するちょっと前まで for 文の外側のブロックをスコープとするルールで正しかった。
ARM (The Annotated C++ Reference Manual) でも旧ルールで説明されている。
VC の出来が悪かったのは事実だと思うが
スコープルールに関しては互換性を是とするウィンドウズの価値観に合わせて
意図的に変更を遅らせたのだと思う。
Visual C++ 6.0がリリースされたのが1998年じゃん 25年前じゃん。全然最近じゃないじゃん 遠い過去のことをつい最近って話すのはやめてほしいね
20年くらいまえのソースコードだったら 読む機会がないわけでもないからなぁ。 最近と言えるかどうかはともかくとして 経緯を知っておくに越したことはない
リアルで トントカイモ をやったことある世代だわ……
>>560 そこは
黙れ小僧、お前にSUNが救えるか!
じゃないの?
sunのccって何だっけ
でも個人的にはc++ユーザなら2014年以降の話をして欲しい
>>563 古い規格に基づいたコードが消滅しているならそれでもいいけどさ。
>>539 アドレスをとったらメモリエリアシング除けで最適化が抑止される
そう思っていた時期が僕にもありました先週
アドレスとエイリアスは別枠なんだわ。 ポインタを数値として表示させると同じなのに == で比較すると偽値 (エイリアスではない) ということがあり得る。 pointer provenance の概念について調べてみると面白いかもね。
古いコードに執着しはじめるならもういい加減引退した方がいい
>>568 誰かが書き換えなきゃ新しくはならんのだぞ。
まったく無いとは言わないが20年以上も昔のコードを弄る機会って実際どれくらいあるのか あまりに不毛な主張だろう
>>129 これが実現出来ればそういう心配事も無くなるんだがな
ちなみに俺は少なくとも C++11 以降だろ (C++20 は時期尚早かもしれない) 派だし 趣味でプログラミングしているから実務現場はわからない。 でも確実に 20 年前くらいのコードは生きてるよ。 質問サイトで (古いコードの意味について尋ねる質問に対して) 歴史的な事情を説明したことは何度もあるから。 それが割合としてどんくらいかというと確かに少なくはあると思うが……。
11は妥当かも。新しいauto は11から一部、で14で増えた訳よね C++の仕事で、例えばauto使ったらダメって言われたら、工エエェェ(´д`)ェェエエ工 アンタ達何でCじゃなくてC++使ってるん?てならんか (マ板的な話でごめんね) 仕事で、Cで未だに99がダメとかいう頭おかしい現場もあり、問い詰めると周辺ツール整備の予算の都合と言い訳される。そういうのを切る政治のために喫煙所活動したり、元社の海外部署の圧を使ったりする まあでも、自衛隊の武器でもC++あったよ…ただ、武器にはちゃんと使用期限があって。5年とか。継続で使いたい場合には再整備事業が起きる。次の期限いっぱいまで修理可能であるように求められるのね 新規は14以上、保守は11以上、は妥当かもね
動的に重たい機能(例外とか)を取り除いたembeded c++に再チャレンジしてほしいわ。 c with structure and template くらいの。
俺も趣味でしか使ってないけど、OSSのメンテやってる外人がCで書かれたコードのこと クソの山と呼んでるのを見かけてみんなそう思ってると信じちゃった
>>577 stacked shit
ソースはフルメタル・ジャケット
My intestine is a kind of FIFO.
>>576 現実がクソなんだよ。
それでもコードにしなきゃならないところ(低レイヤとか速度がいるところとか言語を跨ぐインターフェイスとか)でCが使われるから必然的にクソになる。
他の言語で書いたところでたぶんクソだぞ。
自分としては古いC++のコードの方がクソの山に見える Cはまだまし
5chからの新しいお知らせは、他の板には出ないんだな
古い事自体は悪い訳ではないよね 質が低いけど影響範囲が大きくて修正されずに生き延びてる糞コードが悪いだけで
>>578 stackだけだと積むというだけで高さはわからないような
they stacked shit that highというのが原文
>>576 PythonとかJavaScriptだけの世界に生きてる人たちはC++はクソとか言ってそうな気がする
VCでビルドしたC++ライブラリって mingwでビルドしたオブジェクトファイルとリンクできないよね? Cライブラリだとできるけども
c++だとマングリングの規則がコンパイラごとに違うから無理なはず
COM の規約で運用するという方法もあるけど割とめんどい
C++ライブラリとCライブラリの両方があったので 素直にCライブラリの方を使うことにします
>>585 その原文の訳が「まるでそびえ立つクソだ!」だからhighly stacked shitあたりだろうけど、あれはハートマン軍曹という異常者の語彙だから、多分pile of shitなんかの方が一般的かもね
msvcからmingwに移行しようと思い、7zを展開したらディフェンダーちゃんが反応したので何かと思ったら
7zを展開する前にファイルをExoplorerから右クリックで開いて ディフェンダー無効にしてから展開するだけだろ
Defenderに無害認定されるまで戦い続けるマ?
どういう設定でコンパイルしたら有害認定されるかむしろ知りたいわ
そういや従量課金回線むけに通信量を制限するソフトを入れたら 通信を阻害するマルウェアとして検出されたことがある。 解釈によってはそりゃそうだと思うし、 セキュリティツールは疑陽性が増えてでも偽陰性を 減らす方向に調整するのはしょうがないんじゃねーの
マイクロソフトとしてはストアアプリとして配信して欲しいんだろうね ZIPなどの野良アプリ配布は不遇の時代よ
>>599 コンパイル後のexeがなぜか毎回消える問題は何かのバージョンで過去にあった
Defender様はOS内蔵のC#で作ったexeも容赦なく消してくるぞ 名前が他と被ってたり変な場所に置いたりしてると割と起こる
初期化していないstd::optional <int>をdereferenceすると0として扱われます boost::optional <int>だとAbortされるのですが なぜstdではこのようになっているのかどなたかご存知ですか? $ cat test.cpp #include <optional> #include <boost/optional.hpp> #include <iostream> using namespace std; int main () { std::optional <int> i0; cout << *i0 << '\n'; if (i0) cout << "Initilized\n"; else cout << "Not initilized\n"; boost::optional <int> i1; cout << *i1 << '\n'; return 0; } $ ./test 0 Not initilized test: /usr/include/boost/optional/optional.hpp:1212: boost::optional<T>::reference_type boost::optional<T>::get() [with T = int; reference_type = int&]: Assertion `this->is_initialized()' failed. Aborted (core dumped)
>>608 どちらも事前条件違反での未定義動作の結果。
「0として扱う」と定められているわけじゃない。
boost が assert で止めてくれているのは親切。
boostの方が親切ですよね 何でstdでなくしたんでしょ?
>>612 boostでは初期化済みかどうかを確認していたのを
stdでなぜ確認を外したのか?って問いになります
>>611 に書いたようにパフォーマンスってこでしょうかね?
>>613 std::optionalの仕様がboost::optionalを参考にしたのは確かだろうけど、
std::optionalの実装はboost::optionalの実装をもとにしたわけじゃないだろうから、
不要なチェックが無い状態でむしろ自然。
何か意図を持って「なくした」「外した」などという事実がおそらく無い。
仮に意図的だったとして、ここで誰かがその質問にyes/noを答えても本当かどうかはわからない。
どうしても気になるならライブラリ実装者に聞くべき。
仕様はboostが元になっているのは間違いないので 規格に入れるときになぜこれを変えたのか理由が分かればなと考えました proposal追ってる人でご存知の方がいればなと思いましたが 自分でも読んでみます
>>615 仕様はどちらも事前条件違反での未定義動作で、変わってない。
なので仕様について調べてもおそらく答えは出ない。
assertの有無は実装の範疇。
プログラミングの面接を受けた。言語は何でもいいというので今使ってるC++で予め申請。 ロジックを問う問題なので言語で差はつかない、という話... だったが実際は文字列処理 の問題が多く、これはスクリプト系とかの方が有利じゃないか C++にはなんで文字列のsplit系はないんだろ。どうしてます? <- あ、これが雑多な質問w
ちなみに自分は以前Pythonを使っていた時期もJavaを使っていた時期もあるけど 今は頭が「C++脳」になっている気がして、とっさにそれらを使うとなると不安を感じたのだった やはり常日頃から他の言語も回しておくべきだろうか
次の問題でグラフにプロットしろとか言われそうだなw
>>617 普通は申告した技能に嘘がないことを確かめるのが
面接の主な目的であって
正解率に意味があるような試験ではないよ。
>>617 istringstream と getline を使えば、区切られた文字を順番に取り出せる。
空白文字区切りなら、getline の代わりに >> が使える。
https://maku77.github.io/cpp/string/split.html >>617 C/C++でそれが出来て初めて「C/C++が使えます」って言えるんだ
1つの言語で覚えたあたらしい機能を実現するのに他の言語ではどう書く?って感じで比較しながら書くと記憶が精緻化しやすく忘れにくくなる
>>618 「C++脳」
良く言えるな
C++も不安だらけじゃないか
コーディングテストのはずがメインメソッド作ってって言われたときはこちらからお断り申し上げたことがある
>>625 あ、別にC++が得意という意味でなく、それ以外の言語を使うとき頭がすぐに切り替わらない、
というぐらいの話で
結局そのとき自分は文字をチェックして区切り文字の位置を調べてstring.substr()で切り出し
vector<string>に追加というベタな感じを。でも他の言語でsplit()を呼んで終わりなのと比べると
無駄に焦ったと思われ
>>622 はすっかり忘れていた
>>628 C++20 以降なら std::views::split を使えるよ。
>>628 c++がマニアックなのはまぁわかる
他の言語に切り替わらないっていうのは鍛錬不足じゃあ無いのかね
c++で書いたものを見ながら別の言語に書き換えるっていう作業の時間が足りてないんじゃない?
プリプロセッサディレクテブでマクロを組む方法はないでしょうか? #ifndef XX #define XX 1 #endif define_default (XX, 1); <-こんな感じにマクロ化したい
スマン言いたい事分かった 直接の回答は:わからん。 多分、君の実装アイデアでは無理。 C++というかCな気がするが、コンパイラの規格の中に翻訳作業のステージが確か7つ位定義されてて、その一つがプリプロセス。で無限ループしないようになってたような。 本当にやりたいであろう事(定数定義の記述に定形があって煩雑なのをシンプルに書きたい)なら、私なら別の方法でやる、けどそれは聞かれてないよね
定義をマクロ定義する事はできないよ 都度意味を変えてincludeで読み込ませるとか
よく分からんがC++の範疇じゃなくてcamkeとかコンパイラオプションでやる事っぽく見える
コンパイルオプションでdefineを省略されていればデフォルト値を使うようなコードの構造にしたいのですが、 なるたけmakeやコンパイル環境に依存しないことが希望です。 プリプロセッサを使うと煩雑で読みづらくなってしまうので、カプセル化したいです。 C++ならもう少し洗練された方法がないものかと思うところですが、 定数定義の記述定形があって煩雑なのをシンプルに書く方法があれば教えて下さい
#ifndef XX1 #define XX1 1 #endif #ifndef XX2 #define XX2 0 #endif :
C++ はなるべくマクロを使わずに済む方向に進化してはいるが マクロを使うのであればそれより良い方法はないと思うよ。
俺ならテンプレート引数のデフォルト引数を使うけど、 既存のコードを何とかしたいって事かい?
>>637 君の求めてるエレガントな方法は、知らない。スマンね
私がもし 今すぐ 仕事でやる必要があるなら
XX1 1
XX2 0
というテキストファイルから、君の例示したソースファイルを生成する「ツール」を勝手に作って使い、手で書いたフリをする
数百あるならツールに意味があるし
もし聞かれたらツールで生成したと答えるが、正直どうでもいい
メンテフェーズでの1件2件の追加修正は手で書きゃいい
ここって#とかの文字書けるのかな... #!/bin/bash put_data_list() { cat <<EOF XX1 1 XX2 0 EOF } main() { while read NAME VAL do cat <<EOF #ifndef $NAME #define $NAME VAL #endif EOF done } put_data_list | main
その手のパラメータをマクロとして大量に定義する 必要があるときというのは 開発・実行環境ごとに切り分けたいという要求なことが多くて、 そうだとしたら環境依存を避けたいという要件設定が ナンセンスってことになるんよ。
その開発・実行環境がコンパイラ含めてまるごと提供される場合だと、C(++)基本機能だけで済ませないと何かと面倒というのは分かる ゲーム機とかがそれ
マイコン用のヘッダなんかはそういうテクニックが駆使されてて環境依存を減らしてるから参考になるよ arduinoみたいな特定のマイコンに依存してない環境では特に
最近はマイコンでもC++使うんですか? 普通にC使ったほうがいいと思うんですけどどうなってるんですか有識者の方
C++でもメモリを食わない書き方はあるとだけ言っておく STLライブラリに恩恵を受けて育った温室育ちには理解出来んかもだがな
マイコンのことは知らないが、いまさら、 //コメント スコープ内ローカル変数 関数のオーバーロードや引き数の省略 bool型とture/false識別子 等がないC言語とか無理だなw
組み込み向けでもC99つかえるの? まぁ、最近はclangとかなのかな…日立コンパイラの恐怖とか思い出すわw
スコープ内ローカル変数ってのが何を意味してるのかよくわからんが、 (関数ブロック以外でも) ブロックの先頭では変数宣言できるぞ。 C89 でも。
Z80 だって C99 対応コンパイラは有るくらいだし、現代でも売ってるマイコン かつ C コンパイラが存在するなら大抵は C99 対応くらいはしてるんじゃね。 完璧に準拠ってほどではないかもしれんけど。
今ってマクロ使うよりもモジュールにしてstaticでやる方がオトクなんだって?
マイコンって関数呼び出しなんて重すぎてとんでもないmainに全部ベタ書きしろって世界でしょ? そんなとこでモジュールなんて許されるのか
とんだ時代錯誤だな
関数作るだけで容量が満杯になるっていつの時代のマイコンだよ
今何世紀だと思ってんだよ
VIDEO そーなの? 昔受けた講習で「関数は重いので関数ポインタを扱う用途以外では作りません。処理をまとめるにはマクロかgotoを使います」って言ってて衝撃受けた口なんだけど 時代の流れなのかこの講習がタコなのかあなたがタコなのか専門外だから分からないよ
ホントに極小サイズの容量小さい昔のマイコンならアセンブラでハードウェアアドレスにI/Oコールして組み上げんだろうけどいまのマイコンはそのレベルを既に凌駕して逸脱してるから誰でも気軽に組みやすく仕上がってる micropythonみたいなインタープリタも走るしな
関数を使わないのはRAMは少なくてスタックがシビアだからです
スタックフレームつくるからだろ インラインで全部組めばスタック要らんくなるよ コードの容量は増えるかもしれんけど
何らかの便利な仕組みがあるとそのせいでメモリが足りなくなることもあった そのせいかどうかしらないけど過去はforの階層が7階層に制限されてたり今では意味不明 ブロックスコープの仕組みのためか? ifとgotoにしたら回避できる
プログラムを 2KiB 程度しか書き込めない PIC なんかもあるが そのレベルの機器だとどうせ低レイヤにべったりと 依存せざるをえないだろうし、 C で極端な書き方をするくらいならもっと低級な言語を 使った方が楽かもしれないな。 そういう割り切りが出来ない程度の中途半端なのが一番困る。
>>659 組み込みなら
関数が重い
じゃなくて
スタックが浅い
の間違いじゃないのか?
最近のは単価数百円で256kbとかメモリ積んでるんだな…
その昔、使ってたHP-29Cがサブルーチンのネストが3段までで その後に出荷されたHP-34Cが6段になってるの見て おおーってなった懐かしい思い出
今はinlineや関数テンプレートのように開いたサブルーチンが普通に使えるからなあ
ちなみにその方法でアマギフ入手するとアマゾンアカウント停止させられるから気をつけてね
週3日稼働案件の職種別月収ランキングNo.1は「データサイエンティスト」で月72万円。 上位7職種が月50万円を超える月収。ほぼ全ての案件がリモート可案件。 フリーランス・複業・副業の求人マッチングサービス『SOKUDAN(ソクダン)』を運営する CAMELORS株式会社、週3日フリーランス・副業案件の時給月収年収・職種別 ランキングについて調査した内容をお知らせいたします SOKUDANに掲載されているフリーランス・副業案件のうち、週3日案件に限定して 時給・月収・年収を職種別のランキング記事としています。 ■調査サマリー 週3日稼働案件の月収ランキング1位は「72万円」でデータサイエンティスト 週3日稼働案件の平均月収「460,487円」、年収換算「553万円」 週3日稼働のフリーランス・副業案件の99.4%は「リモート可」 上位12職種が時給3,000円、週3日稼働で月収30万円を超える 上位7職種が時給5,000円、週3日稼働で月収50万円を超える
c++でGUI作る時のフレームワークって今は何が主流なんでしょうか。 昔は、MFCとか有名でしたが。 それとも、c#で簡単にui作って内部的にc++で処理するとかですかね。
Windows での話なら WinUI を活用する方法が現代的なやり方だけど主流と言える感じでもないかな……。 WebView コントロールで全部をやってしまえばウェブ技術がかなり使えるので プログラマの知識バックグラウンドによっては楽ということもあるかも。
なんかもう最近はPCでGUIプログラムなんぞ作ること自体が時代遅れみたいな風潮で息苦しいよ
WindowsとLinuxで同じアプリ動かさないといけない案件でgtkmm使ったことある UIをCSSで装飾できるのがモダンな感じでよかった!
VC++なら実体はC++/CLIの実装なのでちょっとした手間でWinUI 3が利用出来るんじゃないの? 知らんけど
また知ったかが VC++とC++/CLIは全くの別もんだろ
>>680 WineかWSL2あたりじゃね
今やるなら
>>676 wxWidgets とか tcl/tk (C++じゃないが敢えて) とか
>>678 ほんそれ
ロストワールドになりそうな勢い
昔のコボちゃんもこんな感じで引退して逝ったんだろうか
>>680 gtkmm は糞
C++でGUI作るときはQt使ってる。Designerが便利
何故C++のGUIフレームワークのライセンスはLGPLばかりなのか
>>692 qtはqtライセンスあるだろ。
electron はMITだし、wxWidgetsも例外条項付きLGPL。
>C++でGUI 出てくるモノが昔と代わり映えしてなくて草 C#でええやろ
C++よりC#やJavaの方がGUIを書きやすいという言語の違いに起因する理由って何かあるっけ リフレクションやガベージコレクションが別段必須でない気もするし async/awaitが付く前からなんかJava/C#でGUI、という流れになっていた気がするし、 実はインテリセンスが効きやすい、とかアプレット的なやつがActiveXより書きやすかったから、とかそんなのが理由だったりして…… つなみにX window systemは良く知りま栓
GUIツールキットの設計・開発は難しい JavaはAWT→Swing→JavaFX .NETはWinForms→WPF→UWP→WinUI3 何度も作り直してるんだよね C++には標準GUIツールキットなんて要らないよ(どうせ何度も作り直すことになる)
ゴメリよく考えたらフレクションがあると強いわ;;; フォームエディタみたいなやつを提供する立場にたてば ウィジェットクラスを作ったらそれだけでリフレクションを使ってそいつのプロパティーを即エディターのプロパティーに並べられるて 利用者に提供できうる
>>698 それくらいならC++でもヘッダ見ればリフレクション無しでできるんじゃね?
>>696 X の頃は x 用の toolkit があったけど
tcl/tk が便利過ぎてそっちに行った人多し
フォームエディターっていつの時代よ それってホームページビルダーでホームページ作るようなもので柔軟性がないんだよね ウィンドウサイズ固定ならともかく、可変サイズのレイアウト作るならGUIデザイナ使うよりコード書いたほうが管理しやすい ホームページビルダーよりHTML/CSS手書きを選ぶのと一緒
>>698 たしかにそうだよな
スレッド周りなんて他で試行錯誤して枯れて辺りで
正式採用されたもんな
c++builderってネットに殆ど情報ないですね。 書籍もないし。 あまり使われてないからだと思うけど、これ使って開発すると躓いたら解決策見つからず苦労しますかね、、。
Builderの情報はほとんどないけどC++の情報はいっぱいある VCLの情報はDelphiと同じだからなんとか探せばある 自分はBuilderだけ買ったけど同時にDelphiも買っておけばよかったとちょっと後悔はしているね その程度には中途半端な存在と思う
VCLのソースがないと中でなにやってるかワカランからな
ヘッダにインターフェースだけ書いてcppにインプリメントクラスを定義して隠蔽するのって ライブラリとかフレームワークだと意味あるけどアプリケーションレベルの実装でやる意味って無いですよね?
インターフェースが何を指すか次第だけど、たぶんPimplイディオムのことかな? ライブラリみたいに境界がかっちりしてないならそうかもね
>>707 ビルド時間を短縮する目的での隠蔽に使われることはある。隠蔽っていろいろ便利だから。
pimpl は疎結合にできる分だけ 差分ビルドでコンパイルする範囲が 小さくなるから特に巨大なプログラムの開発では ビルド時間を短縮する意味はあるはずだが 余計な構造を挟む煩わしさと比べて 割にあうのはよっぽど極端な場合に限ると思われている。 (意味はあるが意味のある状況は限定的)
>>707 大きなアプリを、元請け社の元で複数の下請けが作っている場合、
お金の流れが全然違う他社のコードとリンクする事はあるよね。
で、紳士協定で「設計書で使っていいと言ってる機能だけ外部から使って」としても
約束を破るバカモノがいる場合もある。
信頼できない他社から自社の身を守る(徹夜で他社のバグ解析に付き合わされる事を防ぐ)など
レイヤー化する事には、もしかしたら意味があるかも知れないね
悲しい&バカらしいかも知れないけど
あとは逆に、自社の実装バグを見つけてアッー!ってなった時に、インタフェースを守ってる他社に、自社の実装変更&リリースによる「再ビルド要」の迷惑をかけてしまう事を防ぐ、意味はあるかも知れない
C++はCの構造体をクラスに流用したからメンバー変数が見えてるけど pimplのように隠れて然るべきが俺の持論 最適化の段階でinline化したい関数で触っている変数のみ pimplの隠れた構造体から表の構造体に移動させているな 面倒くさくないかって? テンプレート用意してるから全然
なんか途中で書き込みに行きやがった JDimバグってないか???
>>715 隠すべきものが隠せていないのはそうだけど構造体を流用したことというよりも、
各翻訳単位でコンパイルしてからリンクするという C の手順を踏襲した都合だと思う。
他の翻訳単位の情報を見ずにコンパイルできる状況にするということを曲げないなら
オブジェクトの大きさを確定するのに必要な情報をクラス定義内に書く仕組みにせざるを得ない。
>707 が言ってるのはたぶん pimpl じゃなくて抽象クラス(=インターフェースクラス)を使った隠蔽じゃないかな? pimpl より楽なので新規クラスではこっちしか使わなくなった。
>>719 メンバー関数の宣言が重複するのが
こちらは嫌なところかなぁ
pimplなんてCでは普通のテクニックだったのにC++はいちいち大げさだなあ
>>717 手元がバグってるだけじゃないかな(名推理)
pimplのクラスか構造体の宣言だけ行うところでC++Testに文句言われる……
Rust使い過ぎてC/C++でclassとstructに;付け忘れはあるある
templateを使わなきゃpimplなんか必要ないだろ。
>>726 やっぱデフォルトでpimplの俺は少数派かなぁ
>>726 というよく読んだら気付いたが
templateこそpimplと相性悪いのでは?
あー、誰かが言ってるようにpimpl使わないと、ヘッダファイルだかCPPファイルだか1行修正しただけで全部再コンパイルされてしまうというのあったな。
自分に合うC++の本を探しています。 独習c++(高橋)を候補にしてます。 以下の程度の人に向いているでしょうか。 Cはポインタを含めてほぼすべて分かります。 C++は昔、クラス周辺の文法を林本で理解したものの、ほとんど書いてないので設計ノウハウがなく、ここは強化したい点です。 C++11より前なので11以降が分かりません。テンプレートやベクターもまったく分かりません。
なんで一冊だけ決めて勉強するのか意味不明なんだな とりあえず読め 沢山読んだら死ぬのか?
>>728 むしろ発想が逆で、templateを使い倒して書いたモジュールをの公開インターフェースからtemplateの痕跡を消してしまうのに使う
ここにいる連中は太古の昔に入門して入門書なんて無縁なんだ 良書などなく分厚くて誤訳満載の本を読んで勉強して血を流しながら進んだ 何冊も読んだ タイパなんてくそくらえ 到達したいところがあるなら時間を掛けろ
今日聞いたのですだがオンライン辞書サービス Dictionary.com にアルゴリズムの短縮形 algo が追加されたらしい すっかり定着したコンストラやデストラといった略語もそのうち辞書に載るかも……
C++ は一般原則で示せない変則的なルールも多いのでそういうのはまるごと知っておくしか仕方がない。 そういったルールの分量が単純に多いから学習するにはたくさん読まないといけないのも仕方がない。 僅かだが互換性を損なう仕様改定もあるし、作法が変わった部分もあるので混乱しないように古すぎる資料は避けた方がよさそうという程度の助言は出来るけど具体的に現代的な入門書というと手堅いものは挙がらんのよな……
Cしか知らんならC++より先に一般的なオブジェクト指向の勉強した方が良さそう Cの延長で文法と機能だけつまみ食いしてたらstaticおじさんが生まれてしまう
C++は余りに途方もないというか、難しいですよね 「ポインタを分かってます」とか言ってしまう時点で想像がつくというか、遠いなというか
とりあえず Effective C++と Effective Modern C++ あたりがいいんじゃない
>>730 色々読むのもありなんだけど
自分にあった本の探し方も学習の一つ
ネットの情報は鮮度もあるし、なんらかの意図が含まれている可能性があるので
本当に自分に合う本を探すつもりなら本屋に行ってみるのもありだよ
それと何を作りたいかによって、選ぶジャンルが違ってくると思うんだ
網羅的に読みたいのであれば、c++の開発者が書いた本もあるし、最近なら苦しんで覚えるシリーズも売れているだろうし
目的を強くイメージできて、この本からその目的の学習ができ、スキルアップ可能なのかどうかをしっかりと自問自答すると…
Mayersはtips集だから
>>730 の段階では早い
Mayersは良いこと書いてるよ
ただしMore Effective C++は訳が酷かった
昔々は技術書系はもう訳がめちゃくちゃだった なんの本か忘れたけど技術者じゃないただの翻訳家みたいのが訳したのがあって ずっと「所与の」の言うワードがページにちりばめられていて読みづらいのなんの 所与の値、所与の条件、所与の… 日常生活で所与のって使わんだろ どんな爺さんが訳したんだか
そんな部分よりも 専門用語がめちゃくちゃで意味が通じない方が問題だと思うよ
スレッドを「糸」と翻訳したり、ポートをマジで「港」と翻訳してる本なら持ってる
ファイバーとかマスタースレーブとか 今だと海外通販の日本語訳が面白い 勝利11 男性女性ケーブル
専門用語は多少は不自然でもいいが(その分野では)皆が一貫して同じ用語を同じ意味で使ってくれんと困るな。 でも慣例が確立していない時代のものなら今の時代から見て不自然なことがあってもそれは仕方がない。
JISが更新されないから新しい日本語訳はもう生まれてこないんだ 新たな誤訳に悩まされる事が無くなってよかったな?
given 与えられた assigned 割り当てられた allocate 配置された 覚えてる感じだと大体このあたりが全部所与のになってた ありえない
・算譜 ・算体 ・算帖 ・算程 ・作譜 ・作譜用言語 ・譜構 ・模塊 ・偏位 ・際どい部分 ・行き詰まり
バグ取りを蟲繕い(むしつくろい)って書いてたのもどこかで見たことがあるな
カタカナ語よりは短く表現できるからもしも訳語として定着していたならそれはそれでアリだと思う。 でも定着しなかったという現実を前にしたら仕方がないね。
>>748 カタカナ語も誤読が蔓延しているので良くない。
garbage ○ガーベジ ×ガベージ
iterator ◎イタレイタ ○イタレータ ×イテレータ
operand ○オパランド ×オペランド
operator ◎オパレイタ ○オパレータ ×オペレータ
reference ◎レフランス ○レファレンス ×リファレンス
storage ○ストーレジ ×ストレージ
>>755 文系くさいマウントだなw
カタカナで書いてる時点で正しい英語でも何でもねえんだよ
文系でも底辺カーストだろ、おまえw
少なくとも長音の位置はどっちが正解と言い切れるものではない
>>758 gar·bage /ˈɡɑːbɪdʒ/
stor·age /ˈstᴐːrɪdʒ/
第1音節が長母音でアクセントもあり、第2音節が短母音でアクセントもないのに、後の方を長くするのは明らかに間違い。
便乗w。警告ウォーニングをワーニングって言うの、やめよう。ね。
automaticの略だから発音は謎 intをなんと発音すべきか問うているようなものよ
routineをルーティーンって書く最近の風潮に違和感
ワーニングは和製英語なんだからワーニングでいいでしょ 服のシワをとる機械のことアイアンって呼んでるの?アイロンでしょ? スキー板を固定する器具をバインディングって呼んでるの?ビンディングでしょ? カタカナ語として定着しているものの発音がーとか言ってもしょうがないよ
>>764 服のシワを取るシステムやスキー用品のシステムを作ってるなら顧客に合わせるけど、ドメイン名解決のソフトはバインドと呼ぶしソケットにアドレスを紐づけるのもバインドと呼んでるよ
まあ君はそれで行きなされ。私も私の道を行くよ
>>753 いいね
野球も〝ひとよし〟〝ふたよし〟でいこうよ
>>766 顧客に合わせるってのは慣習に合わせるってことでしょ? それでいいと思うよ
ワーニングもアイロンもビンディングも慣習的にカタカナでそう綴られてきて定着してる
いまさらネイティブの発音とギャップがあるとか言われてもねえ
アイロンのことを正しい発音はアイアンだよって訂正されたら「この人、日本語のアイロン知らんのかな?」って思うでしょ ワーニングも同じ ワーニングを正しい発音はウォーニングだよって訂正する人たまにいるけど「この人、日本語のワーニング知らんのかな?」っ思う
>>771 これおじさん的に衝撃的だったよね
「テレビ8チャンに変えて」を"8チャネ"に変えてに変えないといけなくなる
英語の発音なんか雑なもんやぞ。 ワイが知っとる例だと particularly をパティキュリと言ってる人がかなり多いとか言う話やな。 音が入れ替わったり脱落したりなんてよくあることで、正しい発音はない。 表音文字なのに音を表すのを諦めとるから雑さが加速しとる気がする。
>>771 通信業界にいた身としては〝Dチャネル〟や〝Bチャネル〟って言ってたけど、テレビは〝チャンネル〟でしょ
そしてここは〝5ちゃんねる〟
>>774 >そしてここは5ちゃんねる
ああ!そうだね
VC++ って名前に反して 実は VC++ Runtime ありきの中間言語ですか、Borland C++ は Native なんでつか?? 折角C++で書いても Win32API 使ったら、 Runtime ないと怒られるのは悲しい><
>>770 情報関係だと基本、カタカナ語使わず英語をそのまま記載するのでゎ。同音異義語が多くて紛らわしいという事もありますし。
人名と用語は英語で記載。
Runtime、Native ぐらいならカタカナでも良いかなと思うが、いちいちそこで切り分けるのも面倒だから、もう英語で。
>>755 誤読はまだしも、誤訳で有名なのは イマジナリショート。
漏れも持ってて勉強した トランジスタ技術 OPアンプ回路の設計という本で、 イマジナリショートと紹介してあった。
しかもご丁寧に imaginary short と。
CQ誌は今でも意固地(わかってて)に、 imaginary short という用語を website に公開してある。
いまでこそソフトウエアの分野では 仮想化技術が浸透したので、仮想といえば virtual だが、
当時は文学が好きな人がイマジナリーと訳しちゃったんのかな、と。
ただそれの恐ろしいことは CQ 誌で紹介された用語が、 Ohm社などの電子回路の教科書にも、えいえんとその誤訳が
使われ続け、半世紀たったいまでも改善がない・・
ソフトウエアもそうだが、ソリッドステート(トランジスタ)回路も、学術より企業の方が進んでいて、 1970年代、企業技術者がまっさきに技術書を書いて、学術家(教員)がそれを天下り的に学生に教えていた経緯から、 おそろしいことに誤訳が広まったのだろう。 幸い、ソフトウエアの用語では誤訳が広まった例を聞いたことがないが、何かあるのだろうか?
Visual C++ ってのも製品名(商標)ではあるが、何が Visual なのか全くわからんな・・・ Runtime 言語だから、 Virtual C++でもよかったのに。。
>>780 GUIか作れたからVisualなんだよ…
virtual関係ない
トランジスタってのもそうですな。これは三本足を意味するので、半導体であることを強調する場合は 古めかしい用語、ソリッドステート がいまだに用語として使われている。SSD、SSRとかも。 あとはダイオードもそうだ。ダイオードといえば今日では半導体ダイオードをほぼ指すが、真空管時代にもダイオードがある。 制御端子のついた素子の場合は、真空管の場合は3つ足ではなく、4つ足だから、これはトランジスタに関しては混同することはないけれども。 カタカナ語なんてのはどうせ和製英語なんだし、そもそもが間違いだから、そのツヅリが多少違ってようが、はっきりいってどうでもいいが、 それよりは用語そのものが重要な気がする。
>>782 GUIだから Visual って、なんかザパニーズ的な発想だな、て思ってさぁ。。
GUIといえば、いまだにツヅリがまともに出てこないのが、 WYSIWYG だな・・・ これなんだよって思う・・覚えにくいわ。
>>784 runtimeもCRTなだけであって中間言語ではない
設定すればリンクしておけた
>>785 wysiwygは画面と印刷の話であってボタンなどのGUIは関係ない
ググったら真空管って色々あるんだな。学校で習ったときは4端子だから、それしか知らんかった・・
>>786 そうだね。でも CLR を含めた DLL は、.NET で動かすことはできないぢゃない。共存できないとかで。
>>789 あまりに物を知らなすぎ
もう少しググってからにしろ
>>786 もどかしいんだよな。 CLI て .NET へ展開ありきなのに、.NET で動かそうと思うと、VC++, .NET それぞれの Runtime
をインスコしないといけないなんて・・
>>791 中間言語は暴論だった。バイトコードとか、そういうのは知ってるよぅ。
でもVC++が Native というと、微妙だよね?
>>794 そう。そういうものだと思って諦めよう。
VC++ Runtime , .NET Runtime 両方をインストールなんて・・・・・
CLR と CLI ってのも 1字違いで紛らわしいよね。作ってるから混同することないが、ネットには嘘ばっかり書いてある。
私が嘘をつくように、Google ったものもやっぱり半信半疑だな。読みづらいけど、MSDN が頼りか。
VC++ の絵本って巷に沢山あるのに、 P/Invoke の込み入った話なると絶滅するのは何でだろう。パンチラ的に紹介してる本は 持ってるが、暗黙で処理される範囲の、marshal_as しか書いてない。 別にあれだけでも、どんな型だろうと、力技で .NET へ展開はできるが、そういうヴァカげたことをしなくてもいいように メソッドがあるらしいが・・ MSDN には網羅的に書いてない気がするんだよな・・ だれかプログラマの人、だれが知ってますか?
でもこれ marshal じゃなく、 winAPI のサイトだった。騙された。
今気づいたが、イマジナリショートの話題を出すこと自体が、名誉棄損になるんだな。 悪意はなかった。
>>784 OS に Windows って名前付けるセンスがもうね
新聞ではウインドウズとかウインドーズとかもう読むのも恥ずかしい
>P/Invoke >pinvoke 前から思ってたけど どう見ても日本語ではピンボケって発音になるんだけど合ってるよね? プラットフォームうんちゃらとは言わないよね?
>>804 新聞は縦書きが基本やからラテンアルファベットは収まりが悪いんや。
VSがC++を広めたという功績をいい加減認識しよう
>>778 それは本人が広めた俗説で武勇伝のように語ってる人がいるだけなんだけどなあ
その人の前にすでに使ってる人がいるらしい
イマジナリーフレンドとか日本ではもう負のイメージしかない
今はネットがあるけど本しかなかった時代はこうだと言いきったらそれがすべてのように語り継がれる よくあった話 考えても無駄で声の大きな人が叫び続けたらそれが真実になった時代
>>808 昔はTurbo C/C++あたりも貢献してた気がする
>>811 void(main) もそうだな。火勃の処理系での話を、一般のCの本で示したり。今は見かけないが。
昔の Cの本では「オマジナイ」と書いてあったのもあったな。今思えばちゃんと書けばいいのになぜ端折るのか。
>>812 漏れウトリ世代やが、ガッコの頃は未だ課題とかでは Borland C++ 試食版を使えて云はれてたな。
Express は有ったと思うが、まだ無料で使える認識はなかった。
IDEがお高いなら如何しようもないし。
無料云々よりも MS 毛嫌いしてた教官が多かったな。逆に漏れは UNIX のシステムコールに嫌悪して、パソコンは向いてないなと絶望したクチだが。
>>813 main(void) だったw 恥w 過去のゆがんだ知識だけで喋るとろくなことねぇな・・ググって喋るか・・
大丈夫 そいつの人生が燃え尽きる前の最後の連投だろうからじきに居なくなるはず
どんなスレでも、開いたら真っ先に赤い ID を連鎖で消せばエエんやで。読む必要なんて全くない。
Borland がまだ試用版出してることに気づいてビビったぬ
経緯はよう知らんけどBorland --> Embarcaderoやね C++Builder(Delphiだったか?)の円盤に入ってたWin32APIヘルプファイルには大変お世話になりました
>>780 統合開発環境Visual Studioで動かせるC++なのだ
からでは……
Delphiが始めからC/C++だったら天下取ってた しかし当時のC++仕様は微妙すぎた Delphiである程度成功はしたがBorlandにとっては運命の割れ目だった
独自拡張というならVC++は上位互換ではあるけどほぼ別言語といえるレベルにまで拡張してる(
>>686 )
C++
↓
C++マネージ拡張
↓
C++/CLI ← いまここ
>>825 Visual Studio のほうがだいぶんあとから登場したんだよ。
Visual C++ は C++ の統合開発環境であって、後に Visual Basic などの 他言語と統合された開発環境 Visual Studio のパッケージのひとつという扱いになった。 (それまでは Visual という名前を冠した一連の製品ではあっても個別のものだった。)
処理系をコマンドラインから起動すると Microsoft(R) C/C++ Optimizing Comiler と表示されるので処理系の名前としてはこれが正式(?)なのかもしれない。
へぇ、ためになった。AI君も僕にかまってくれてありが 10。
しかし AI script ってあんまり進化してないよな。技術的な質問に答えて呉れる AI を見たことがなひw
AI君って何時から御活躍してんでせうか。もやし、したらば時代から居たとか?だから牽制のために ROM ってろ文化があった?
自然言語処理の次は圏論か。これもクリアしたら人間っていったいなんだろうなみたいな存在になるな。
頭で考えたら、美しい組版の帳票がアウトプットされる世の中はまだかい? AIって人間虐待のための技術かょぅ
この国の AI って下品なんだよなぁ。。上流階級のためのAIなのに、当の AI はとにかく下品。。。
LaTeX のあの組版の美しさに感動するやうな感性を持った、 AI の登場が望まれる。 鮮人臭ただよう AI では夢がない。
躁は夜更かしすると悪化するから早く寝なさい あと病院行きなさい
>>827 勝手に仕様拡張しても、皆が受け入れたら仕様の方が合わせてくるでそ
>>839 ソコマデ傲慢にわなれなかったんじゃネエかと思いますケドぬ
>>826 BorlandはDOS用のCUI上のC++GUIフレームワークのOWLっていうものを持ってたんだがな
MFCみたいな糞に負けるとは情けない
>>826 >>841 自己レスだが久々に調べてみたら
OWLNext っていうのが継承しているらしい
使って観れば良い
あれ見てきてるとエックスも結局匕に戻すんじゃねと懐疑
いつの日かVB6案件があるかもと思って まだ押入れにVisualStudio6Enterがある しかし受注するのはJavaやC/C++ばかり
略じゃなくてオノマトペ drag&dropのdropを「ポト」、pasteを「ペタ」と言ってる 知らんけど
drag&dropのdropを「ぽと」と言ってる cut&pasteのpasteを「ぺた」と言ってる ってことだろ
youtubeで見たけどFC版のドラクエの作ってた人は何十年ぶりかのDQのデバッグで直接バイナリ書き換えてたな ジャンプ先も数えてた 俺はIDEとポトペタ使わせてもらうわ
結局バグらなければいいから好きな方使えばいい ただキーボード打つの速いからIDEいらないとかは 逆立ちでピアノ引けます自慢みたいなもの ピアノ引くことが目的なのに逆立ち部分いらないだろっていう
江添さんが頭を剃りあげているのはストラウストラップ氏に対するリスペクトを表しているのですか?
本出版してるとハゲ呼ばわりして良いルールでもあんの?
ハゲることが男のたった一つの勲章だって この胸に信じて生きてきた
>>867 ハゲ呼ばわりではなくて名前を上げること
本を公に刊行するということは批判の対象になるということ
名前を上げても構わない
>>871 批判と侮蔑って全然違うけど、お前、本気でそれ言ってんの?
出版物の内容についての言及なら著者名を出したっていいよ リスペクトで髪剃ってるのか?とか出版物関係ないだろ そういうのはやめろって話だ
>>874 >リスペクトで髪剃ってるのか?とか出版物関係ないだろ そういうのはやめろって話だ
それは俺じゃない
俺じゃないならなんでこの流れでわざわざ出版があーだこーだ言い出したの? そういった行為は横紙破りって言うんだよ口語ではあんま使わない言葉だけど 社会でうまくやっていけてなさそう
自分で剃ってるのかと思ったが 本人が反論したことで 本人の望まない形で禿ていることがバレるという悪循環
>>876 彼は出版しているので
名前を出されても構わない立場の人間であるということ
モブとは違うんだよ
>>880 正論
>>879 書いてないと主張するお前が、名前が書かれた文章前半の一部のみ勝手に正当主張をしてるのはわかってるんだけど、後半の文章についてはどう考えてるの?
>>881 >書いてないと主張するお前が、名前が書かれた文章前半の
>一部のみ勝手に正当主張をしてるのはわかってるんだけど、
>後半の文章についてはどう考えてるの?
どれか分からんからきちんと書け
横から入ってきた割に、話が通じないやつって初めて見た
>>883 プログラム書いてるだろうに文章が下手過ぎるから話が通じない
俺は侮辱するようなことは一言も書いていない
別人が書いたのを読み違えてるんだよ
>
>>886 ちゃんと覚えとけよ
それは俺じゃないからね
ハゲはナニやってもハゲるらしいからな 理由なんて無いだろう
ハゲるヤツはナニやってもハゲるらしいからな そもそも理由なんて無いのだろう
Stroustrupのことはハゲハゲ言うくせに江添に対しては厳しいんだなw
ひさしぶりにこのスレにきてわかったことがひとつある C++はハゲと相性が良い
C++使うとハゲるって当初噂になったぐらいだが 知らんのか
空いたプランクを埋めるためにC++言語仕様を高速に無理矢理理解しようとすると却ってストレスがたまってハゲることになる恐ろしい言語
>>895 MJD?
Miwa C++ のエピスメーテーさんもHAGEなの?
時期を逸するというのはなんとも悲しいものだ 取り返しはつかない
C++とMFCのコンボで世の中の何本の毛根が失われたのだろう
質問なのですがサイズnのstd::vector<T> vecに対してi番目(i=0, 1, 2, ..., n)の要素の直前に要素elemを1個挿入する(ただしi=nは末尾に追加と解釈する の書き方はどうすればいいですの? とりま2種類考えた、 1) size_t sz = vec.size(); auto ins_it = (i < sz) ? std::next(vec.begin(), i) : vec.end(); vec.insert(ins_it, elem); 2) size_t sz = vec.size(); if (i < sz) { vec.insert(std::next(vec.begin(), i), elem); } else { vec.resize(i + 1, elem); }
vec.insert(vec.begin() + i, elem);
だから I hate C++ の Matz はまだフサフサなのか
コードの内容なんか忘れた半年後に 再びコード見てその瞬間、分かるように書くのが一番 その為のSimple is bestに同意
読み取りやすいように書くのは大事だけど、少し汚くても わかりやすい名前を付けておけば割となんとかなる。
おっと、名前付けの話?オッチャン持論語っちゃう 関数に長い名前つけるのはありと思うが、変数名は宣言箇所にコメント書いて2文字とか短い変数名が好き ワシは元々BASICから始まってSmalltalkを学んだクチだけど、一時期のjavaみたいななんでも長い名前にするやつ大っきらい。Cの母音ラクダ方式大好き
お前の好き嫌いでは議論にならん 優劣を語れよ、ジジイ
>>912 が優劣について数字を出して語ってくれるそうです
どうぞw
C++ はある程度は汚いものだろう。 隅々まで綺麗にしようと腐心するよりは 少なくとも部品のインターフェイスくらいはまともにして 外側に対しては綺麗なふりをするくらいが手頃な妥協点だと思う。 逆にミクロ的にスマートに書けていても 抽象化が駄目だと使いにくいよ。 内も外も綺麗ならそれに越したことはないけど そうもいかないのが現実だからね。
>>906 天才か!
なんかこの前動かしたら駄目だった気がしたけど
今やったら動いたわサーセン;;;
vectorなのかvecなのかは言語開発者がそうと決めたからそうなってるだけ 昔はコード補間もなくx-windowのアホみたいな長い呪文APIぶち込んでたけど今もそれだったらぶち切れてる 意外なことに開発環境が変わればいろいろ変わる
今windowの更にクソ長い基地外じみたAPI打ってるのもコード補完があるから
名前の長い短かいについては上述のとおり技術の進歩、開発環境の変化で落しどころがかわってくるが 俺的にはむしろネーミングのセンスのほうが気になる 俺がまだフサフサだったころはイキって一般によく使われる単語とちょっと違う単語をわざわざ探すようなことをしていたが 頭髪が薄くなるに従ってそういうことはくだらない事と思うようになり 今はできるだけベタな誰が見ても即座に意味がつかめる、あえてダッサいネーミングをするよう心がけてる 例:データを吸いあげて収納するメソッド名 フサフサ俺がつけがちな名前 → .BeamMeUp() ハゲ俺がつける名前 → .LoadData()
>データを吸いあげて収納する ハゲなのに5W1Hすら知らないと見える
恥ずかしながら学生の頃はドイツ語で命名してましてねフフフ
>>919 レス引用が分かりにくくてスマンカッタorz
そこではなくて挿入位置にsize()まで指定してたら末尾に要素が追加にできるところ
std::vector<int> vec = { 1, 2, 3 };
vec.insesrt(vec.begin() + vec.size(), 4);
cout << vec << endl; // ( 1 2 3 4 )
ラズパイレートでいうと 民主党政権の頃は1ドル80円だったけど いまは1ドル200円
ラズパイレートでいうと 民主党政権の頃は1ドル80円だったけど いまは1ドル200円
>>921 5W1HはMITが提唱したんじゃなかったっけ
変数でも関数でも 初見もしくは内容忘れた自分が 読んだとき何をやってるか分かるような名前付けが大事だと思う よって長さは常識の範囲内なら長い方が良いかな どうでもいいループ変数にindex2SearchArgumentHaystackとか 書いてたら殺意を覚えるけどさ
GetSelectedPersonDataFromLiveDBIfNotExistsReadDefaultValueFromSettingFileType2022Ex
リテラルで簡潔に書けるのでみんな初期化子リストばんばん使ってると思うけど initializer_listって必ずコピーが発生するのな non copyableなクラスが使えなくて不便なんだが、回避策ない?
>>932 >non copyableなクラスが使えなくて不便なんだが、回避策ない?
moveすれば?
>>935 https://wandbox.org/permlink/n0KXbXrmLzHDl6KU 次のコードがコンパイルできない
struct A {
A(int) {}
A(const A&) = delete;
};
int main()
{
std::vector<A> v = { 1, 2, 3 };
}
>>936 ,937
あれ?
$ cat test.cpp
#include <iostream>
using namespace std;
struct A {
A () {cout << "construct" << endl;}
A (const A &p) = delete;
A (A &&p) {cout << "move" << endl;}
};
void func (initializer_list <A> p) {
cout << "func" << endl;
}
int main () {
A a0;
A a1;
func ({move (a0), move (a1)});
return 0;
}
$ g++ test.cpp
$ ./a.out
construct
construct
move
move
func
だめかなぁ... #include <vector> struct A { A(int) {} A(const A&) = delete; A(A&&) = default; }; std::vector <A> construct (std::initializer_list <A> p) { std::vector <A> result; for (auto itr {p.begin ()}, end {p.end ()}; itr != end; ++ itr) result.push_back (std::move (const_cast <A &> (*itr))); return result; } int main() { std::vector<A> v = construct ({ 1, 2, 3 }); }
>>936 コピコン消したいなら代入オペレータ用意してやらんとダメだろ
initializer_list<A&&>が作れないから波括弧初期化できないって話か なるほどね
initializer_list作るとこまでは出来てもムーブで取り出せないのよ
だからvectorのコンストラクタにinitializer_listで渡すとエラー出るし、
>>939 のように
const外して一つずつ突っ込むとかしなきゃいけなくなる
ムーブ可能にする提案は出てるらしいけど
https://cpplover.blogspot.com/2014/11/2014-10-pre-urbana-mailings-n4160-n4169.html?m=1 https://wandbox.org/permlink/h9ZXqkhA56d7EOYP std::vectorだからどうしようもないけど、自作クラスならinitializer_listよりも可変長テンプレートをオススメしたい
これならコピー不可(ムーブのみ)なクラスでも集成体初期化出来る
(ただしコンセプトかenable_ifでAまたはAに暗黙変換可能な型に限定すべき、enable_ifでもメタプログラミングで条件式作れる)
あ、すまんコメントのとこだけどis_convertible_vの引数は逆だった
もう一つ訂正すまん、集成体初期化じゃないな一様初期化かリスト初期化かorz
もうC++の仕様拡張はもう限界なんだよ あっちを立てればこっちが立たずが毎回問題になる
std2 作ってゼロからやり直さないと C++はどうにもならんね
>>946 deque の方が常に良いことが多いと思う
initializer_list でうまくいかんときは
make_tuple か tie でごまかしたことがある気がするけど
あれも move じゃなくて copy だったかな
最近は Rust の方がその辺は楽な気がするな
>>952 initializer_listでmoveできない問題なら
>>939 で良いのでは?
template化して関数名短くすれば使い心地は{}と
そう変わらんと思うが?
chatGPTが今ダウンしているので質問します 以下のC++コードでfirst->secondとなっている部分がよくわかりません vector<pair<int, int>> A(N); for(auto& [x, y] : A) cin >> x >> y; unordered_map<int, int> X, Y; for(auto& [x, y] : A){ x = X.try_emplace(x, X.size()).first->second; y = Y.try_emplace(y, Y.size()).first->second; } try_emplaceはPair<iterator,bool>を返すオーバーロードがあるので firstまではわかるもののそこからさらにsecondとすると何がおきるのでしょうか
>>955 格納しているのがペアなんだからペアの second 側が得られるってだけ。
イテレータは operator* や operator-> をオーバーロードしていて
要素へのポインタであるかのように扱えると考えていい。
単に入れ子になってるだけ ポインタの先の要素がまたポインタで指してるだけ
>>956-957 ありがとうございました。
iteratorを返したらそのiteratorに対してさらにsecondを呼び出しているのですね
C++モジュールについて ・CMakeが3.26で実験的対応、3.28で正式対応 ・g++は対応状況が良くないが、2024年第二4半期に対応できるとKitwareは考えている ・VS2022最新版内臓のCMakeバージョンは3.26 ・Clangとclはモジュールに対応している
Cスレで話題になっててちょっと疑問を質問 自分はgotoって全く使わないで書いているんだけど実際のところどうなんだろう https://learn.microsoft.com/ja-jp/cpp/cpp/goto-statement-cpp?view=msvc-170 「可能な限り、goto ステートメントより break、continue、および return ステートメントを使用することをお勧めします。 ただし、break ステートメントはループの 1 つのレベルのみを終了するため、深い入れ子のループを終了するには goto ステートメントを使用する必要がある場合もあります。」 俺も深い入れ子のループを抜ける方法として ・ループ部分を関数化してreturn ・breakで抜けて if(/* 抜けた理由を再度評価 */) break; を繰り返す (※後述) ということをしている けどgotoで抜けるほうが楽だろうなと思うんだけど、まあ単純なバグ(プログラマーの見落とし)を除いてどういう問題があるんだろうか for ( i = 0; i < 10; i++ ) { printf_s( "Outer loop executing. i = %d\n", i ); for ( j = 0; j < 2; j++ ) { printf_s( " Inner loop executing. j = %d\n", j ); if ( i == 3 ) break; // 内側のループ抜け } if ( i == 3 ) break; // 外側のループ抜け } >深い入れ子のループを終了するには goto ステートメントを使用する必要がある場合もあります って描いてあるしそれが問題とは言ってないんじゃないか
まあ問題あるならそもそも導入されるはずがないわけで問題ないのは分かるんだけど 「可能な限り〜お勧めします。」と言うように使用を推奨しない理由は何なのかなと 例えば特定の処理が飛ばされて動作しなくなる場合があるとかなんかな?と
それはrustのラベルbreakのような 安全なループの抜け方しか考えてないから安全で当たり前 c/c++のgotoはもっと凶悪なことができる
C++のgotoはちゃんとデストラクタを呼んでくれるから、意外とそんなに破滅的なことにはならんのだよね だからって多重ループ脱出以外で使おうとは思わんけど
>>966 気軽に例外投げるとデバッガが使いづらくなるからやめときな
少なくとも仕事では
多重ループ脱出で使っている人って多いんかな? 他にこういう使い方しているとかってない?
>>963 一般論としてはそのほうが分かりやすくなるからというだけのことだと思うよ。
ただ、それで分かりやすくならないとき、
チマチマした条件チェックであっちこっち行くよりは
流れをぶった切って goto したほうがいっそわかりやすいこともあるってのが
goto が必要な場面ってことなんだわ。
>>968 自分としては多重ループ脱出がC++でのgotoの唯一の実用的な用途だと思ってる(とはいえめったに使わない)
Cなら疑似finally的な後処理に使うこともあるけど、それはC++ならRAIIにすべきだしな
それ以外の戻ったり余所のスコープに侵入したりはもちろんCでもC++でも論外
>>970 VSのデバッガは例外投げられるとメッセージでる(設定変えればオフにはできる)
また設定によってはブレイクする
正常処理のくせに頻繁に例外投げられると非常にうざいし、本当の異常を見過ごす
switchとgoto組み合わせて状態機械作ってる
gcc拡張のlabelのアドレスとれるやつとかな 昔はイキって使ってたわ
>>974 そりゃうざいデフォルト設定だな
ループの脱出に限らず例外くらい普通に使うやろ?
ちゃんと切っとけ
>>977 例外が起こったときは何かおかしいことが起こっている予兆と考える防御的なVSをおれは支持する
だいたい例外安全って何それ?ってレベルのやつも多いだろ
例外で遊ぶのは趣味のときだけにしとけ
ループ脱出レベルで例外を使うのは変だと感じる 関数抜けないのに例外なんて…
んで大昔に例外に似た機能のFound文Match文とか妄想してたんだな 実質タダのgoto文
>>978 ループに限らず孫関数ひ孫関数からエラーで脱出するときどうしてんの?
例外使わんか?
例外は通常動作として起こらないような動作で起こすもので 何か探すループなんかで実際に対象が見つかったとしてそれは「例外」なのか? ちがうだろー
>>979 俺はgotoは全く書かないな
パフォーマンス的にはgotoの方が良いかな?
>>984 それが一般的な解釈でおかしな使い方をしてる人間は影で笑われている
>>985 人格を攻撃するような書き込みはやめようね
例外はパフォーマンス的に重いしそれ以前に 正常系の出力を異常系で投げるのはおかしい まったくもって異常
よその言語ではイテレータの終了通知に例外使ってたりするから人格否定するほどの話ではない C++の慣用としてやられてないし向いてないってだけ
>>987 >正常系の出力を異常系で投げるのはおかしい
これを書いたのはあなたで私ではないよ
>>989 >>987 の「例外はパフォーマンス的に重いし」のような議論は分かるが
>>985 は人格を攻撃している書き込み
気をつけ給え
>>981 エラーならありだがtry catch書かされるのもだるいだろ
現実的に例外投げる場合はそのまま終了か、フルリブートするしかないときって考えたほうがいい
非常に大切で根本的な理由と例を挙げたのに「実にくだらない理由」としか取られないのが残念 例外はただの制御構文ではない
>>991 実にくだらない理由か本当に?
理解不足だと思うけど
凶悪といえばAnsiCのsetjmp()とlongjmp() あれらを規格に入れてるのはキチガイとしか
>>993 ,994
そう思う
>>982 >例外は通常動作として起こらないような動作で起こすもので
これは今行っている議論の対象である
>何か探すループなんかで実際に対象が見つかったとしてそれは「例外」なのか?
何に使うかの理由に名称を持ち出すのは
私はくだらないと考えている
>>996 概念だろ
それが一番大切で実装の基本だろ
C++自体の仕様が変わるとしても例外と言う概念に沿って変わることになるはずだ
今適当にマッチを投げていて仕様がより例外側に代わってその時その使い方は生き残れるのだろうか?
>>997 templateメタプログラミングとか許せない人ですか?
Core Guideline にも例外はエラー処理だけに使えとある. 多重ループからの脱出が本当にエラー処理なの?
このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 174日 19時間 30分 57秒
5ちゃんねるの運営はUPLIFT会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。
▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.net/ ▼ UPLIFTログインはこちら ▼
https://uplift.5ch.net/login
read.cgi ver 07.7.23 2024/12/25 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20250310112750caこのスレへの固定リンク: http://5chb.net/r/tech/1683600652/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓この板の人気?スレ↓(一覧 ) ・【.NET】F#について語れ3【OCAML】 ・C#, C♯, C#相談室 Part98 ・開発工数を大幅削減できた言語は存在しない ・Copyrightは著作者を守る権利でなくコピーする権利 ・スレ立てるまでもない質問はここで 147匹目 ・プログラミングがわからなすぎる ・【悲報】リーナス、横80文字やめるってよ ・【DDD】ドメイン駆動設計【エリック・エヴァンス】 ・Julia「いくぞ!」Python「合体!」R「ったい!」→ ・Visual Studio Code / VSCode Part11 ・従軍慰安婦はでっち上げ ・C言語で関数を書いていくスレ ・ハッシュ使うのやめてクラスにしましょう ・PHP,Ruby,Pythonは運用コスパが悪い/Java最強伝説 ・gifガイジを作るンゴ! ・Machine Learning's code generator伝説 ・スクラム Redux Reactive ・Pythonは同じ事するのにforと内包表記の2つの方法が ・C++でXML(主にxerces)やろう! ・AI AI って夢見すぎてない? ・アセンブリ ・アマゾン配達AI「配達地まで40kmなので1時間で行け」 ・ウイルスの最小サイズについて ・お前らが持ってる資格を書いてけ(IT以外でもOK) ・Dart part1 ・書いたプログラムを批評して下さい ・プログラミングのお題スレ Part19 ・Access VBA 質問スレ Part1 ・C++相談室 part165
17:28:00 up 24 days, 8:50, 0 users, load average: 240.77, 231.19, 200.01
in 0.23711013793945 sec
@[email protected] on 111607