STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
10 :
デフォルトの名無しさん:2010/10/09(土) 22:12:09
■C言語のみの質問はC言語スレで聞いた方がいいです。■
C++とC言語は別の言語なので、
CのみのコードならC言語スレに行った方が良いと思います。
理由:
1. C言語用のスレがせっかくあるのだから。
2. C言語はほぼC++に取り込まれているが、だからといってC++スレで
聞いたからにはC++にしか通用しない文法や標準ライブラリやクラスで
で返されても仕方ないことだから。
__ __ ┌──┐ ┌───────┐
\ \ \ \ └┐ │ └────── │
\ \ \ \ │ │ / /
\ \ \ \ │ │ / /
\ \ \ \ │ │ / /
/ / / / │ │ / /
/ / / / │ │ _ / /
/ / / / │ │ ( /____/\
/ / / / │ │ \ )
 ̄ ̄  ̄ ̄ └─┘  ̄ ̄ ̄ ̄ ̄ ̄ ̄
12に見えるぞ
クラス内の配列をキャスト演算子で配列引数のテンプレート関数に渡せるような書き方ってないですか?
ないあるよ
>>13 クラスにそれを吐くメソッド入れるってのは無しなんだよね?
>>13 配列なら、配列引数の関数テンプレートに渡せるだろjk
なんでキャスト演算子とか出てくるのかわけわからん。
new使った動的配列だとか?
もしそうなら
int[10]とint*であれば*(int (*)[10])&pみたいになるな
CとC++の違いって何ですか?
C++の方がなんか強そう
Cは職人
C++は工場
>>15 それはつまり目的のテンプレート関数の機能をもうクラスに入れちゃうってことですか
ただ想定としてはいろんなテンプレート文字配列関数にそのまま渡せるような
キャストがあれば知りたいなと思いまして、上ような関数なんかも目からウロコでしたし
>>16 すんません、配列をメンバに持つクラスをキャストして上のような関数に渡せないかということです
>>17 いえ、申し訳ないですが静的な配列です
配列の参照を返すoperator()を定義でいいんじゃない
>>21 >22 の言う方法でお題は達成できるんだろうけど、キャストを持ち出すべき
ところかなあ?そのキャストが入ったコード読んでも意味わからない状態に
ならない?
ちゃんと名前をつけて配列の参照を返す関数を作ったほうがいいんじゃないか?
一応目的は配列引数のテンプレート関数にクラスを渡す方法なんで
それがキャストである必要は無いですね
もしかしたら、テンプレート関数のほうを改造するほうが良い可能性も考えられる。
27 :
デフォルトの名無しさん:2010/10/11(月) 02:05:21
最近姿を見せなかったGが今6匹いっせいに飛び出してきた
地震に注意しろよオマイラage
>>25 おお!すごい!
>typedef char (&S)[N]
これで配列参照の戻り値にできたんですね(なんだか関数ポインタに似てる)
実は今までキャスト以外でも配列の参照を返せませんでした…
29 :
デフォルトの名無しさん:2010/10/11(月) 03:27:44
std::valarray<>について質問です
template<class T>
std::valarray<T> doSomething(const std::valarray<T> &v){
...
}
std::valarray<float> A, x;
....
doSomething(A - x);
これでちゃんとdoSomethingが呼ばれるかと思いましたが,
doSomething(std::_Expr<std::_BinClos<std::__minus, std::_ValArray,
std::_ValArray, float, float>, float>)
が無いと言われてコンパイルエラーになりました.
std::valarrayとして渡せないはずは無いと思うのですが・・・
valarrayの - 演算子って定義されてるの?
エラーメッセージ見ると、どうやらその実装はExpressoin Template的なものを使ってそうだな
doSomething(std::valarray<float>(A - x));
とか
doSomething(A -= x);
でどうだ?
MSVCの実装は単に要素ごとに引いてるだけだから、コンパイル通ったけどね
templateを使ったコードは実行速度が遅くなりますか?
いいえ
34 :
32:2010/10/11(月) 11:48:03
コンパイラの実行速度が遅くなります
抽象クラスに静的メンバ変数もたせても、その変数は使えますか?
使える。
ありがとう。一生忘れない。
C++でコードの一部の実行時間を計るのにそのコードだけにかかる
時間を計ることは出来ますか?
普通はどうやって測るのが一般的ですか?
時間の差
関数の前と後にtimeGettime
>>39 自前でコードに精密タイマ埋め込んで計る。
あるいはインテルなど各社から出ている測定ツール使う。
純粋仮想デストラクタを定義して、その派生クラスでデストラクタを定義したんですが、
なぜか外部参照エラーが出ます。
エラーは基底クラスのデストラクタを参照してエラーが出ているようです。
原因として何が考えられるでしょうか?
基本クラスのデストラクタがないから
派生クラスのデストラクタは必ず自動的に基本クラスのデストラクタを呼ぶ
抽象クラスを作って、その派生クラスを作ります。
派生クラスのインスタンスが消滅した場合、抽象クラスのデストラクタも
実行されるのでしょうか?
はい
>>44 でもその基本クラスのデストラクタが定義されてないのでエラーがでるということですか?
もしそうなら、純粋仮想デストラクタというものは定義できないのでしょうか?
純粋仮想関数も中身を定義できるんだぞ
とeffective C++にかいてあるんだぞ
う〜ん。
純粋仮想関数化すれば、基本クラスのデストラクタが実行されないと思ったので、無駄な処理が
省けると思ったのですが。
でも純粋仮想関数化(後ろに=0つける)したのに、外部参照エラーが出るんです。
具体的にどうしたらよいでしょう?
>>50 純粋じゃなくて中身か空のデストラクタにすればいいんじゃね。
辻褄合わせに必死の言語なんだから、深い事は考えてはいけない。
純粋仮想デストラクタの(中身空の)定義も書いてやればいい。
class a {
virtual ~a() = 0;
};
a::~a() {}
IEnumerableオブジェクトが勝手に定める順序で列挙されるでいいんじゃなイカ?
ランダムだろうと気分だろうと勝手に定めた順序だ
unique_ptrからshared_ptrへの変換は安全なのでしょうか。
std::unique_ptr<std::wstring> GetName();
のような関数があって、普通は戻り値のunique_ptrをそのまま
使えばいいのですが、vectorに入れたいケースがあり、shared_ptrに
変換したく、次のようなコードを書きました。
std::vector<std::shared_ptr<std::wstring>>> vec;
std::shared_ptr<std::wstring> str = GetName();
vec.push_back(str);
こういう書き方って安全なんですか?
unique_ptrの一時オブジェクトが作られ、それからshared_ptrへのムーブが
暗黙のうちに行われているので安全ではないか、と考えているのですが。
>>51,52
できました!ありがとうございます!
この場合これを継承した派生クラスが消滅した場合、
この抽象クラスのデストラクタは実行されないんですかね?
>>55 VC10でソース見たけど、shared_ptrにunique_ptrの右辺値参照する代入演算子が定義されてるね。
OKのようだね。
これは便利だ。ありがたく使わせてもらうよ。
というかその程度の機能すら持ってなかったら標準ライブラリとして使い物にならないよ
もっとも、unique_ptrをvectorの要素にすることだって可能だよ。
>>59 unique_ptrならauto_ptrと違ってvectorそのものの動作に問題はないんでしょうけど、
要素を取り出すとき、つまらないミスをしそうですね。
暗黙のムーブを発生させちゃって、vectorには無効なunique_ptrが残ることに。
……と思ったけど、
>>55 が可能なのは GetName() の戻り値が右辺値たり得るからですね。
vector から要素を取り出すときは常に左辺値になるから、そんな心配はいらないのか。
明示的にムーブしない限りは大丈夫じゃない?
auto x = vec.front();
とかやって「先輩!コンパイルできません!」と泣きついてくる奴はいそうな気がする。
auto &x = vec.front();
「こうすれば大丈夫だよ」と理由や副作用も含めて教えてあげればいいんだが、
auto x = std::move(vec.front());
こういうやり方を教えて「こうすればコンパイルできるみたいだよ」なんて言う奴は
ウチの会社にはいないはず……うん、いないはず……
>>55-63 それを説明するには、lvalueとrvalueの区別をきっちり説明しなくちゃいけないな。
俺自信ない。
03ですら使わせてほんとに大丈夫かっていう連中がそこかしこにいるのに
0xになってさらに混乱しそうな仕様がいくつも追加されても困るよな
まあ業務では0xコンパイラ使わなきゃいいだけって話だけど
98ならおkってわけでもないんだろ?
Javaでもやらせとけ
ようするにC++は玄人の玩具的な扱いが加速しすぎているんだよ
もっと仕様を軽量化単純化したC++Liteを作るべき
Embeded C++ ゴゴゴゴゴゴゴゴ・・・
>>67 いちいちアレが使えてこれが使えなくてとか確認することになるぜ
余計ややこしくするだけだっての
他の言語かC使えばいいんだよ
>>68 組み込みもやってるけど一度も使った事ないわそれw
70 :
デフォルトの名無しさん:2010/10/11(月) 21:34:17
> いちいちアレが使えてこれが使えなくてとか確認することになるぜ
今現在そのような状況なのを何とかしてほしいってことだろ
関数テンプレートの部分初期化とかリンカがコンパイラを呼び出したりとか
けどC++は何でもありってのは良いところでもあると思うんだけどな
自分のグループやプロジェクトではそれなりにルール決めると良いだろうが
たまに Java 使うと窮屈に感じてしょうがない
C++ で配列の要素数を求めるテンプレート作りたいのですが、
template <class T, int N>
int length(const T (&x)[N]) {
return N;
}
const BYTE* ptr = &values[0];
inr length = length(ptr);
とすると
error C2784: 'int length(const T (&)[N])' :テンプレート 引数を 'const T (&)[N]' に対して 'const BYTE *' から減少できませんでした
とエラーが出てしまいます。
どうすればいいのでしょうか?
>>73 const BYTE* ptr これ配列じゃないよ
length(values)
ぷっ
>>74 すみません。
void hogehoge(const BYTE *values)
{
なんです。
void hogehoge(const BYTE values[])
{
にしても、C2784エラーがでてしまいます。
>>76 そのhogehogeもテンプレートにしちゃいないよ。
それも配列ではないよ
void hogehoge(const BYTE& values)
{
こうですか?
素直に vector 使え
もう大分前から STL は C++ 標準
関数を沢山作ると、関数の並び方によって見やすさが変わると思います
void print1();
void print2();
void print3();
の方が
void print3();
void print1();
void print2();
より見やすい気がする
お前らはどんなルールで関数を宣言していますか?
世界最高峰のプログラマーだが、そんなこと気にしたことないね。
書けるとこに書けばいい。
スレ違いだから。
>>92 printを使うのは良いとして 1,2,3 なんてイミフなラベル付けないなぁ
処理される順に書くか対になるものを並べるかは迷うことが多い
init → begin → end → free か
init → free → begin → end
87 :
85:2010/10/11(月) 23:46:01
説明しやすいように連番使っただけでそこをgdgd言うのは単なる揚げ足取りだろう・・・
単なる関数名の例にケチつけるとはさすが
辞書順だろ
結局はこれが一番一覧性高い
>>82 それぞれどんな機能差があるか分からないけど、番号だけで分けるなんて安易で酷いと思うよ
>>88-89 説明のためだけなら、実用における
void print1();
void print2();
void print3();
と
void print3();
void print1();
void print2();
の違いがさっぱり分からないわけだが。
>>82 宣言とか定義場所の並び順なら、グループ別に分けてコメントで見出しと説明文とgrep用の印付ける。
その上で呼び出し順序のある物ならその順番で書いて、そうじゃない単位での並び順はそんなわらわら増えた事も無いし適当。
>>92 辞書順の例を出しただけ。
他にどんなルールで並べてるのかを聞いてるんだよ
想像力の欠乏した奴が多いなw
>>94 というか辞書順という言葉が分からなかったんだろ?
97 :
29:2010/10/12(火) 06:16:30
1,2,3だけで辞書順であることを想像しろと言われてもなぁ。せめてA,B,Cにしろよ。
>>80 テンプレート配列
#include <iostream>
template<class T,int N>
inline int length(T (&a)[N])
{
return N;
}
int _tmain(int argc, _TCHAR* argv[])
{
int s[70];
std::cout<<length<>(s);
return 0;
}
誰かSleepをしない、fps計測コードを貼ってくれませんか?
お願いします。