C++相談室 part48
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
2006/03/15(水) 20:53:15ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
→ テンプレその他 >>1-15 付近参照 ←
前スレ
C++相談室 part47
http://pc8.2ch.net/test/read.cgi/tech/1139931895/l50
0153デフォルトの名無しさん
2006/03/21(火) 11:23:12うっかり書き換えてしまうのを防ぐことができるじゃないか。
いつの間にか const スレが落ちてるのに気づいた。
0154デフォルトの名無しさん
2006/03/21(火) 11:26:14void f(const string &s);
だと、
f(s);
としたときに、sの値が変わらないことが保証される。
「値が変わらない」の正確な意味は型によるけど、
たとえ内部表現が変わっても観測可能な振舞は変わらないように
const性が定義されてることを期待できる。
これで十分じゃないか?
0155デフォルトの名無しさん
2006/03/21(火) 11:29:55手間がかかりすぎる気がするなあと。
stlもconst_iteratorとかさ・・。もう疲れたよ。
全てつけるのやめるとすると、上の以外なんか問題ってあるん
だったっけ?
0156デフォルトの名無しさん
2006/03/21(火) 11:36:31静的な定数テーブルがプロセス間で共有できない。
または ROM に配置できない。
0157デフォルトの名無しさん
2006/03/21(火) 11:37:34constスレとカンマスレを偲ぶ人多いね。
良スレだったってことですね。
0158デフォルトの名無しさん
2006/03/21(火) 11:43:44ほら、保障っつってもさ、const_cast程度で外されちゃうし、
大した保障じゃないなら、もう
void f(string &s);
でいいんじゃないのかなーとか思うんだよね。そうするとさ、
void getHoge() const{}
これは意味的定数性だからconstにして、メンバはmutableつけて
対策してと・・とか色々考えるのから開放されるしさ。
そもそもきっとconst導入した人は、ビット的定数性なんて問題を
想定してなかったような気がするし、そうするともう役目を終えてる
というか、なんかほとんど効力がない機能のような気がするんだよなあ。
0159デフォルトの名無しさん
2006/03/21(火) 11:52:250160デフォルトの名無しさん
2006/03/21(火) 11:56:510161デフォルトの名無しさん
2006/03/21(火) 12:00:430162デフォルトの名無しさん
2006/03/21(火) 12:35:25値セマンティクスのクラスにはconstをしっかり考えてやるべきだけど、
参照セマンティクスのクラスはあまりconstを考える必要はない。
というのをどこかで読んだ覚えがある。
0163デフォルトの名無しさん
2006/03/21(火) 14:28:47>>151
C は自分で作ったクラスではないので、いじらずに済ませたいのです。
Interface Pattern はアリですが、もっとシンプルなのが無いかと思いまして。
>>150
C++ の範囲内でやる方法は無いですかねえ。
0164デフォルトの名無しさん
2006/03/21(火) 14:38:230165デフォルトの名無しさん
2006/03/21(火) 18:38:02>const_cast程度
程度じゃねえよ、const_castは実装のための最後の手段の1つで、
そうホイホイ使うような物じゃないだろ。
constは単純なread onlyインターフェイスを生成する手段の一つだと思ってる。
read onlyインターフェイスが要らないクラスなら、無くてもいいんじゃね。
0166デフォルトの名無しさん
2006/03/21(火) 19:06:120167デフォルトの名無しさん
2006/03/21(火) 19:16:39と、途方にくれるな
0168デフォルトの名無しさん
2006/03/21(火) 20:24:55class Hoge
{
public:
const_reference operator [](std::size_t i) const {/* 〜 */}
refernece operator [](std::size_t i) {return const_cast<reference>(static_cast<const Hoge&>(*this)[i]);}
};
0169デフォルトの名無しさん
2006/03/21(火) 21:49:36こっちのがよくね?
reference operator [](std::size_t i);
const_reference operator [](std::size_t i) const {return const_cast<Hoge&>(*this)[i];}
0170デフォルトの名無しさん
2006/03/22(水) 00:14:24コンストラクタで、メンバーイニシャライザで初期化するには
どうすればよいでしょうか?
0171デフォルトの名無しさん
2006/03/22(水) 00:16:17できません。
0172デフォルトの名無しさん
2006/03/22(水) 00:17:10んですね。ありがとうございました。
0173デフォルトの名無しさん
2006/03/22(水) 00:50:14ちょっと、言い方がおかしかったかも。
constの価値がないと言ってるんじゃなくて、概念的定数性の存在価値は
あるのかってことを言いたかった。
Java的に言うとimmutableパターンによるスレッドセーフなオブジェクトと
シャローコピー時のデータ汚染の回避みたいなメリットが、概念的定数性
だとmutableによって、当然どっちも失われるわけだから、苦労する意味は
いったいあるのか?みたいなことを言いたかった。
0174デフォルトの名無しさん
2006/03/22(水) 01:14:34bar();
{
static int si = 123;
return si;
}
}
みたいなC++の関数があるとして、si用のメモリが123に初期化されるのは
どのタイミングでしょうか?
1 プログラムが実行開始した瞬間
2 main関数到達前
3 foo関数初回呼び出し直後
4 変数siの存在するブロックに初回に入ろうとする時
くらいの候補があると思うのですが。手持ちのコンパイラでは1でしたが、
標準で保障されているのがどこまでかが知りたいです。
0175デフォルトの名無しさん
2006/03/22(水) 01:17:00その言い方だと mutable さえ使わなければ挙げてるメリットが得られるんだろ?
十分だと思うなぁ。
なんで mutable の使用が前提になってんの?
0176デフォルトの名無しさん
2006/03/22(水) 01:24:29大抵はデータセグメントに配置されて、プログラムロード時に初期値が設定されるんじゃねーの?
0177デフォルトの名無しさん
2006/03/22(水) 01:26:41POD 型のローカル static オブジェクトが定数式で初期化される場合、
プログラムが初めてブロックに入る前に初期化されていればいつでもいい。
6.7 -4-
ttp://www.kuzbass.ru/docs/isocpp/stmt.html#stmt.dcl
0178174
2006/03/22(水) 01:32:41ども。クロスプラットフォームなコードを書いている関係で、「PODなロー
カルstaticオブジェクトの定数式による初期化」がスレッドセーフに行わ
れるかどうかを気にしているのですが、スレッドが絡むと標準仕様では何
ともいえないですかね・・・。
0179デフォルトの名無しさん
2006/03/22(水) 01:54:22大丈夫、どのスレッドかは兎も角、どれかのスレッドで最初に実行されるまでには
初期化されている。
まぁ、volatileつけないとどの道まともに扱えないわけだが。
0180デフォルトの名無しさん
2006/03/22(水) 01:56:04GCC 4.0 の変更点 http://gcc.gnu.org/gcc-4.0/changes.html に挙げられていた
リンクからたどった、関係ありそうな記事へのリンクを貼っておく。
http://www.codesourcery.com/cxx-abi/cxx-closed.html#G4
あんまりしっかり読んでないけど、とりあえず
いろいろがんばってる人たちが居るのはわかった。
「POD なローカル static オブジェクトの定数式による初期化」に限れば、
わざわざ初期化を遅らせるメリットも無いと思うんで、おおかたの実装で
グローバルなのといっしょにまとめて初期化されるだろうね。
ところでクロスプラットフォームでスレッドを扱うなら、使ってるスレッドライブラリに
ここらへんの問題に対処する道具があったりしないかな?
0181デフォルトの名無しさん
2006/03/22(水) 02:04:36いや、何の前提も加えずに大丈夫とは言えないだろう。
現行の規格ではスレッドについて何の言及も無いわけで、
規格に準拠したコンパイラがスレッドを考慮したコード生成を行うとは限らない。
0182デフォルトの名無しさん
2006/03/22(水) 02:12:18そうだっけ?
確か大抵の実装は関数に入る際にフラグをチェックして
初回ならば、コンストラタを呼び・・みたいに展開されるので
マルチスレッドの場合はコンストラクタが2度呼び出されるので
危険だったような・・
だとすればPODの場合もアウトなので、その関数はまずシングル
スレッドで一度呼び出されていないとまずくなると想定していて、
俺は怖いのでそうしてる。
0183182
2006/03/22(水) 02:20:06http://gcc.gnu.org/gcc-4.0/changes.html
The compiler now uses the library interface specified by the
C++ ABI for thread-safe initialization of function-scope static
variables. Most users should leave this alone, but embedded
programmers may want to disable this by specifying -fno-threadsafe-
statics for a small savings in code size.
gcc4.0はfunction-scope staticはthread-safeを保障しているみたい
VCはどうかな
0184182
2006/03/22(水) 02:36:28概念的定数性ってメンバにキャッシュ処理的なことしてる場合に
GetHoge()とかがメンバを変えるけど、意味的にはconstって
ことだろ?
class A{public:
void GetHoge() const{a_ *= 2; return a_;}
mutable int a_;
};
でも、constにしたいからメンバをmutableにするって理解
だったが・・、なんか違うかな?
んで、結局GetHogeはスレッドセーフじゃないし、immutable
オブジェクトにもならないからメリットはなんだ?という
ことを考えたが。
0185デフォルトの名無しさん
2006/03/22(水) 03:00:39mutable を使えばそうなる。あたりまえ。
それは const の機能について「ほとんど効力がない」という理由にはならないだろ。
結局は、キャッシュや遅延評価を装備したオブジェクトから値を取り出す
メンバ関数に const 付けて mutable 使うか、非 const メンバ関数にしてしまうか
という2択で迷ってるだけじゃないの?
0186デフォルトの名無しさん
2006/03/22(水) 04:29:01>それは const の機能について「ほとんど効力がない」という理由には
>ならないだろ。
いや、だからそれは173で訂正してると思う・・
> 結局は、キャッシュや遅延評価を装備したオブジェクトから値を取り出す
> メンバ関数に const 付けて mutable 使うか、非 const メンバ関数にしてしまうか
> という2択で迷ってるだけじゃないの?
Yes。けど、"ただ"と言えるほど簡単な話ではないと思う。(EffectiveC++
で筆者は両者の方法は哲学的問題と言ってるが)。そして、今のところ自他
ともスマートな解決方法は聞いたことがない。
185はどっちの立場でやってる?
0187デフォルトの名無しさん
2006/03/22(水) 04:32:270188デフォルトの名無しさん
2006/03/22(水) 05:10:020189デフォルトの名無しさん
2006/03/22(水) 06:14:22多分,下の2つのスレのことかと思われ.いずれも dat 落ち.
【C++】 const だけでメシが3杯食えちゃうスレ
http://pc8.2ch.net/test/read.cgi/tech/1078193971/
【C】カンマ演算子を極めるスレ【C++】
http://pc8.2ch.net/test/read.cgi/tech/1112011590/
0190デフォルトの名無しさん
2006/03/22(水) 07:21:33>まぁ、volatileつけないとどの道まともに扱えないわけだが。
kwsk
0191174
2006/03/22(水) 07:45:15ので問題ないですね。しかし、MS/Sun/HP/Intel/..のコンパイラだとどうな
の?というのが気になっている&コンパイラ買えないという感じです。
local staticは諦めて、
static int si = 123;
int foo() {
bar();
return si;
}
にすればOKでしょうか。
0192デフォルトの名無しさん
2006/03/22(水) 07:51:000193174
2006/03/22(水) 08:02:43http://www.kuzbass.ru/docs/isocpp/basic.html#basic.start.init
を見るに外なら"static initialization"が行われるそうですが、
ほんとに実装依存?
0194デフォルトの名無しさん
2006/03/22(水) 09:18:28関数オブジェクトに汁
0195174
2006/03/22(水) 09:26:19すみません、もうちょい具体的に・・・
0196デフォルトの名無しさん
2006/03/22(水) 09:29:220197デフォルトの名無しさん
2006/03/22(水) 09:56:18http://www.google.co.jp/search?hl=ja&q=%22%E9%96%A2%E6%95%B0%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%22&lr=
0198デフォルトの名無しさん
2006/03/22(水) 09:59:30template <typename A,typename B>inline char *binary_pack(const std::map<A,B> &src,char *from)
{
*((int*)from)=(int)src.size();
from+=4;
for(std::map<A,B>::const_iterator i=src.begin();i!=src.end();i++)
from=binary_pack(*i,from);
return from;
}
という関数を作ったのですがg++(gcc3.4.4/FC4)で通らなくて困ってます。
エラー内容はiteratorのiが定義されてないということらしいのですが、
VC++7やgcc3.2.4あたりでは通ったり(警告でる)します。
同じ関数名でいくつか似たような機能のものを複数多重定義してますが、
mapでないvectorのiterator作ろうとしてもエラーでてしまいます。
-fno-implicit-templatesのようなオプションも無駄でした
(http://www.sra.co.jp/wingnut/gcc/gcc-j.html#Invoking%20GCCより。
たぶんiteratorの定義方法が正確ではないのかなと思ってるんですが
エラーの対処方法詳しくわかる方居たらご教授願えないでしょうか?
0199デフォルトの名無しさん
2006/03/22(水) 10:05:12かな
0200198
2006/03/22(水) 10:10:32typenameつけたらwarningもでなくなり通るようになりました。
0201デフォルトの名無しさん
2006/03/22(水) 10:10:41本当にコンパイル通ったのか?
再帰の実引数 *i は map の const_iterator が指し示す先で
再帰の仮引数 src は map そのものへの参照やんけ
0202デフォルトの名無しさん
2006/03/22(水) 10:22:050203デフォルトの名無しさん
2006/03/22(水) 10:33:43多重定義だろ。
0204デフォルトの名無しさん
2006/03/22(水) 10:54:35VC8のビルドは、configure.batを走らせてからでないとビルド出来ない。
多分もう誰でも知ってると思うけど、一応初心者用に書いておきます。
0205デフォルトの名無しさん
2006/03/22(水) 10:54:560206185
2006/03/22(水) 12:36:58> いや、だからそれは173で訂正してると思う・・
ごめん。見落としてた。
よく考えると、概念的 const のせいで苦労が増すというのがおかしいと思う。
スレッドセーフが必要なら、どのみち値の算出(〜設定)に同期が要る。
クラスが内部でやらなければ利用者に責任が押し付けられることになる。
シャローコピーしたところで概念的に const でさえあればデータ汚染にはならない。
>>184 の例がまずいのは、繰り返し GetHoge() を呼び出すだけで値が変わっていくから。
一般的なキャッシュ、遅延評価の実装では他の非 const 操作が行われるまで
外部に返される値は変わらない。この場合、他に非 const 操作がなければ
Immutable オブジェクトとしての性質を満たし得るだろう。
先にインターフェースを考えて、実装段階でキャッシュが必要になることを考えると、
immutable を使った概念的 const も妥当だと思う。
0207デフォルトの名無しさん
2006/03/22(水) 15:10:380208デフォルトの名無しさん
2006/03/22(水) 15:20:22今の定義で十分に対応可能だし
0209デフォルトの名無しさん
2006/03/22(水) 15:21:34禿もそういってるし
0210デフォルトの名無しさん
2006/03/22(水) 15:31:520211デフォルトの名無しさん
2006/03/22(水) 19:01:380212デフォルトの名無しさん
2006/03/22(水) 20:22:270213デフォルトの名無しさん
2006/03/22(水) 21:44:54共用体なので問題ないと思っていたのですが、何が問題なのでしょうか。
#include <iostream>
using namespace std;
union bits{
bits(double n);
void show_bits();
double d;
unsigned char c[sizeof(double)];
};
bits::bits(double n){
d = n;
}
void show_bits(){
int i, j;
for(j = sizeof(double) - 1; j >= 0; j--){
cout << "ビットパターン/Byte" << j << ": ";
for(i = 128; i; i >>= 1)
cout << i & c[j] ? "1" : "0";
cout << endl;
}
}
int main(){
bits ob(1991.829);
ob.show_bits();
return 0;
}
0214デフォルトの名無しさん
2006/03/22(水) 22:03:15なんでshowのほうにbits::ねえんだよ
あとi&c[j]は括弧でくくれ、優先順位が違う
0215デフォルトの名無しさん
2006/03/22(水) 22:11:38すごい単純ミスですいません。
ありがとうございました。
0216デフォルトの名無しさん
2006/03/22(水) 22:17:44boostじゃだめなの?
0217デフォルトの名無しさん
2006/03/23(木) 02:30:020218デフォルトの名無しさん
2006/03/23(木) 02:32:06変数への読み書きが「副作用」とみなされ、最適化で削除されなくなる。
また、 const と同様にオーバーロードに使われる。
0219デフォルトの名無しさん
2006/03/23(木) 02:37:42ちなみに所謂cv修飾のvなのでconstがつけれるとこならどこにでもつけれる。
# c は const
0220デフォルトの名無しさん
2006/03/23(木) 02:42:14と考えると、実際どういう場合につけるべきなのか
難しいですね。一時変数は別に不要だとわかりますが
クラスのメンバー変数は全部つけないといけなくなるのかな
0221デフォルトの名無しさん
2006/03/23(木) 03:04:13コードから見ていつ変わるかわからん変数やオブジェクトにつけるべし。
具体例をあげると複数のスレッドから変更される変数やオブジェクトとか
メモリマップドI/Oなんかに対してつける。こういった変数やオブジェクトに
アクセスする時に最適化が効いてるととんでもないことになる。
大変なことになる一例をあげると下のコードで hoge をどっかスレッドがfalseにしても
最適化が効いちゃってると無限ループになっちまう。これを避ける為には hoge を volatileで修飾すべし!
bool hoge = true;
void hige() {
while(hoge);
}
0222デフォルトの名無しさん
2006/03/23(木) 03:36:43削除されるのは変数じゃなくて、変数への読み書きだぞ。
メンバー関数に全部つけるとか、ただの糞コードに他ならない。
0223デフォルトの名無しさん
2006/03/23(木) 08:48:56f(void* p);
ってふうになってるケースがあるからこれらを呼び出す時にconstキャストは多々つかいますわ。
0224デフォルトの名無しさん
2006/03/23(木) 08:50:20何言ってんの?
0225デフォルトの名無しさん
2006/03/23(木) 09:04:30C 用に設計されたコールバックなどの汎用引数には
ほとんど void* が引数として使われるので、そこに
const T* を渡そうと思ったら const_cast が必要になる。
ってことだと思われ。
0226デフォルトの名無しさん
2006/03/23(木) 10:07:45>最適化で削除されたくない
^^^^
必ずしも削除じゃないよ
普通に文脈解釈したときの意味が変わるような削除まで無限に許しているわけじゃない
本当に厳密なタイミングが必要な箇所だとか、a -= 0; みたいに意味なさそうに見える箇所だとか、
本来ならアセンブラで書くような性格を含んでいるところに、取扱注意と書いておくだけ
>>222
メンバ関数全部に throw() をつけるたり
非静的メンバ関数全部に virtual をつけたり
基底指定子全部に public をつけたり
C++ ってデフォが糞なの結構あるね
0227デフォルトの名無しさん
2006/03/23(木) 10:12:18ではデフォルトで全ての変数をvolatile扱いしてほしいということですか。
0228デフォルトの名無しさん
2006/03/23(木) 10:26:08必要な箇所に必要なキーワードを置くことにいやも好きもない
俺はドライに割り切ってるが、糞という表現がでてきたんで言い出したらキリねえぞってだけ
0229デフォルトの名無しさん
2006/03/23(木) 10:51:310230デフォルトの名無しさん
2006/03/23(木) 11:10:320231デフォルトの名無しさん
2006/03/23(木) 12:34:360232デフォルトの名無しさん
2006/03/23(木) 15:24:49#include <iostream>
using namespace std;
template <class T>
class coord {
T x,y;
public:
coord(T i, T j) { x=i; y=j; }
friend ostream &operator<<(ostream &stream, coord ob);
friend ostream &operator>>(istream &stream, coord &ob);
};
template <class T>
ostream &operator<<(ostream &stream, coord<T> ob)
{
stream << ob.x << ' ' << ob.y << endl;
return stream;
}
template <class T>
istream &operator>>(istream &stream, coord<T> &ob)
{
stream >> ob.x >> ob.y;
return stream;
}
int main()
{
coord<int> i_ob(1,2);
cout << i_ob << endl;
return 0;
}
こういうコードコンパイルしたら「外部シンボルoperator<< ... が未解決」と怒られました。
どこを訂正すべきでしょうか?
0233デフォルトの名無しさん
2006/03/23(木) 15:37:30#include <iostream>
using namespace std;
template <class T> class coord;
template <class T> ostream &operator<<(ostream &, coord<T>);
template <class T> istream &operator>>(istream &, coord<T> &);
template <class T>
class coord {
T x,y;
public:
coord(T i, T j) { x=i; y=j; }
friend ostream &operator<< <T>(ostream &stream, coord ob);
friend istream &operator>> <T>(istream &stream, coord &ob);
};
0234デフォルトの名無しさん
2006/03/23(木) 15:47:10T x,y;
public:
coord(T i, T j) { x=i; y=j; }
- friend ostream &operator<<(ostream &stream, coord ob);
- friend ostream &operator>>(istream &stream, coord &ob);
+ template <typename U> friend ostream &operator<< (ostream &stream, coord <U> ob);
+ template <typename U> friend ostream &operator>> (istream &stream, coord <U> &ob);
};
-template <class T>
-ostream &operator<<(ostream &stream, coord<T> ob)
+template <typename U>
+ostream &operator<<(ostream &stream, coord<U> ob)
{
stream << ob.x << ' ' << ob.y << endl;
return stream;
}
-template <class T>
-istream &operator>>(istream &stream, coord<T> &ob)
+template <typename U>
+istream &operator>>(istream &stream, coord<U> &ob)
{
stream >> ob.x >> ob.y;
return stream;
0235デフォルトの名無しさん
2006/03/23(木) 17:26:23メンバテンプレート使うと、BCC5.8.1では「このコンテキストでは<<が
曖昧です」とか言われる。BCCのバグらしい。
gcc3.4.2(MinGW)、VC8ではちゃんと通る。
0236デフォルトの名無しさん
2006/03/23(木) 19:58:46// --- fig1 ---------------------------
template <typename T> struct X {
template <typename U> friend void f(X<U>&)
{
X<int> a;
a.y = 0;
}
private:
int y;
};
main()
{
X<void> x;
f(x);
}
この場合、
・Borland 5.5.1 は private のみを問題視
・g++ 4.1.0 は X<void> で宣言された f と X<int> で宣言された f が曖昧と言ってくる
俺は g++ に賛成
0237デフォルトの名無しさん
2006/03/23(木) 19:59:06// --- fig2 ---------------------------
template <typename T> struct X {
friend void g(X<T>&)
{
X<int> a;
a.y = 0;
}
};
main()
{
X<void> x;
g(x);
}
この場合、
・Borland 5.5.1 は X<void> で宣言した friend 権限は、X<int> には及ばないと言ってくる
・g++ は何も言ってこない
俺は Borland に賛成
0238デフォルトの名無しさん
2006/03/23(木) 20:11:320239デフォルトの名無しさん
2006/03/23(木) 21:22:47fig 2の方は何がしたいか分からんのだが。
0240デフォルトの名無しさん
2006/03/24(金) 00:22:11DQN発見..というのは言い過ぎかもしれないが..痛い。
別のスレッドがその変数に触るなら、mutexなりcritical sectionなり
で排他制御するのが正しい。もしそれを省略してlock-freeなアルゴ
リズムを採用したいのなら、volatileではなくメモリバリアを使え。
0241デフォルトの名無しさん
2006/03/24(金) 00:24:55片方はコンパイラ向けで、片方はCPU向けでそ?
0242240
2006/03/24(金) 00:32:28渡した場合について調べてみれ。
0243デフォルトの名無しさん
2006/03/24(金) 00:44:590244デフォルトの名無しさん
2006/03/24(金) 01:31:370245デフォルトの名無しさん
2006/03/24(金) 01:36:20volatile が必要になるようなケースで、volatile を書かずにメモリバリアを入れても駄目でそ。
っていうかメモリバリアってSMPじゃないと意味ないし。volatileはスレッドや割り込み処理でも
有効に使える・・というか正しく使わなくてはならない。
0246デフォルトの名無しさん
2006/03/24(金) 01:40:460247デフォルトの名無しさん
2006/03/24(金) 01:49:01DQN発見..というのは言い過ぎかもしれないが..痛い。
mutexなりcritical sectionなりを使ってもvolatileを使わなければ
コンパイラの最適化で無限ループになっても文句は言えない。
0248デフォルトの名無しさん
2006/03/24(金) 02:13:16>mutexなりcritical sectionなりを使ってもvolatileを使わなければ
>コンパイラの最適化で無限ループになっても文句は言えない。
え??
0249デフォルトの名無しさん
2006/03/24(金) 02:55:29さすがにグローバル変数の場合には volatile なしでも関数呼び出しの前には
値をストアするだろうし、後で参照すれば値をロードしなおすコードが出る出祖。
auuto 変数の場合にはコンパイルオプションによってはロードしなおさないコードが
でることもあるかもしれない。この場合には明示的な volatile が必要か。
0250デフォルトの名無しさん
2006/03/24(金) 08:17:050251デフォルトの名無しさん
2006/03/24(金) 13:45:39オーバーしてしまった時に自動でリサイズしてくれるような
クラスを作りたいのですが、
x[i] = x[i-1] + vx[i] * dt;
と言うような感じのコードを実行したときに、
「x[i]」でリサイズが必要になった場合、
「x[i-1]」の参照が無効になってしまうと言う状態になってしまいました。
なにかこう言った状態を解決する方法はないのでしょうか?
よろしくお願いします。
0252デフォルトの名無しさん
2006/03/24(金) 13:49:02operator [] の戻り値を参照型じゃなくて値型にしていれば
そういった状態にはならない。
配列クラスへのポインタとインデックスの組み合わせを持った
プロキシオブジェクトを返すことでも解決できるかもしれない。
■ このスレッドは過去ログ倉庫に格納されています