C++相談室 part88
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2011/02/08(火) 14:16:35ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part87
http://hibari.2ch.net/test/read.cgi/tech/1291890680/
http://hibari.2ch.net/test/read.cgi/tech/1289292155/l50
このスレもよろしくね。
ついでに壁紙にしてね。
http://www.research.att.com/~bs/Bjarne.jpg
0002v(^・^)v
2011/02/08(火) 14:18:09[C++ FAQ]
http://www.parashift.com/c++-faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[Stroustrup大聖人]
http://www2.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?id=15868
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003v(^・^)v
2011/02/08(火) 14:19:25[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0004v(^・^)v
2011/02/08(火) 14:20:22amazon C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
http://www.amazon.co.jp/b/?node=754384
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
0005v(^・^)v
2011/02/08(火) 14:21:07Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
■長いソースを貼るときはここへ。■
http://codepad.org/
http://ideone.com/
0006v(^・^)v
2011/02/08(火) 14:21:49環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
-------------------------------------------------
テンプラ終わり(・∀・)
0007デフォルトの名無しさん
2011/02/08(火) 14:45:54定数だけ定義されたクラスを作ってクラス名::定数名でアクセスするのがいいの
0008デフォルトの名無しさん
2011/02/08(火) 14:50:13一つ目のクラスでprivateでstatic const で定義し、二つ目のクラス用にそれをfriendにする
0009デフォルトの名無しさん
2011/02/08(火) 14:57:160010デフォルトの名無しさん
2011/02/08(火) 15:15:17class Test2;
class Test1 {
static double d;
public:
friend class Test2;
static void printd() {
std::cout << d << std::endl;
}
};
double Test1::d = 1.23;
class Test2 {
public:
void printd() const {
Test1::printd();
}
};
int main()
{
Test1 t1;
Test2 t2;
t1.printd();
t2.printd();
}
0011デフォルトの名無しさん
2011/02/08(火) 15:15:21ARを用いてWEBカメラで対象のマーカーを認識したのちに出力といった形にしたいです。
形式としては、メモリに最初読み込んで、マーカー認識時に音楽再生
現状は
#include <mmsystem.h>と、リンカで Winmm.lib を追加しています。
プログラム的には、
int main(void)内に、
PlaySound("testfile.wav",NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
で再生し、PlaySound(NULL, ,NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
で停止させています。
DirectXのLoadSoundMemを使えば、一行で済むのですが
if( DxLib_Init() == -1 ) return -1; // 初期化
DirectX初期化時に黒枠ウィンドウ(CMD)が残るため、使い物になりません。
良い方法ないでしょうか?
0012デフォルトの名無しさん
2011/02/08(火) 15:51:19なんでそんなめんどくさいことしてるのかわからん
0013デフォルトの名無しさん
2011/02/08(火) 16:16:27該当スレ行け
0014デフォルトの名無しさん
2011/02/08(火) 16:38:26SND_MEMORYちょっと調べてみます、サウンド系はDirectXでしか触ったことないので
ググッても中々…
>>13
一応ARはC++で作成するものですので(他にもありますが)
該当スレかと
0015デフォルトの名無しさん
2011/02/08(火) 16:42:19SND_MEMORY調べたときにsndPlaySoundも見つけ上手く出来ました感謝。
sndPlaySoundA((LPCSTR)lpSound,SND_ASYNC|SND_MEMORY);
0016デフォルトの名無しさん
2011/02/08(火) 17:17:05コピーの途中でコピーコンストラクタが例外を投げて、コピーが中断したら
途中までコンストラクトされた要素はデストラクトされるのでしょうか?
もしデストラクトされない場合は、try-catchで捕捉してデストラクトする
などの処理が必要でしょうか。
0017デフォルトの名無しさん
2011/02/08(火) 17:18:460019デフォルトの名無しさん
2011/02/08(火) 18:02:34それはDirectXじゃなくてDXライブラリだって話もあるが、
そもそもAPIの話は該当スレに行けと言ってんだよ
0020デフォルトの名無しさん
2011/02/09(水) 01:55:11つっこむなら、DirectXでやったことあるならわざわざDXライブラリ経由しなくていいじゃんって方向じゃないか?
0021デフォルトの名無しさん
2011/02/09(水) 02:13:120022デフォルトの名無しさん
2011/02/09(水) 02:23:56一般的なポインタのルールにのっとってそういう感じになってるわけだからねー。
0023デフォルトの名無しさん
2011/02/09(水) 03:04:52つか、
shared_ptr<T>ptr;
ptr.use_count()でshared_ptr<T>::use_count()を
ptr->use_count()でT::use_count()を呼び分けてるのは分かってる?
0024デフォルトの名無しさん
2011/02/09(水) 16:59:41class Test
{
public:
void test2(T* pTest) {}
void test1() {
Test<Test<T>*>* pTestTest = new Test<Test<T>*>();
pTestTest->test2(new Test<T>());
}
};
Test<int> test();
test.test1();
このコードをコンパイルすると
pTestTest->test2(new Test<T>());
の箇所で
「1 番目の引数を 'Test<T> *' から 'Test<T> *' に変換できません。」
とコンパイラに怒られてしまいます。
型解決が無限ループとなっている(?)のが原因だと思うのですが、Testクラス外でtest1を定義する以外に解決方法はありますでしょうか?
よろしくお願いします。
0025デフォルトの名無しさん
2011/02/09(水) 17:23:540026デフォルトの名無しさん
2011/02/09(水) 20:25:38gcc4.5.1(MinGW + Eclipse CDT)で実行済
template<class T>
class Test
{
public:
void test2(T* pTest) {
if (!pTest)
return;
std::cout << "test2()" << std::endl;
}
void test1() {
Test<Test<T>*>* pTestTest = new Test<Test<T>*>();
pTestTest->test2(new Test<T>*());
}
};
int main()
{
Test<int> test;
test.test1();
int i = 0;
test.test2(&i);
}
0027デフォルトの名無しさん
2011/02/09(水) 21:23:12単純に型の指定ミスだったとは…
おかげさまで解決しました。ありがとうございました
0028デフォルトの名無しさん
2011/02/09(水) 23:43:47上のようなコードを思いついたので、実装してみたんだが、仕様的にはだいじょうになのかな??
環境はVC10EEでつくったんだけど、そのページのGCCでも期待通りに動いてるみたいだ。
002928
2011/02/09(水) 23:49:07テンプレートの型指定子に毎回異なるものを入れると並列化されるみたいなんだけど、
これは環境依存になるのかな?
って書けばよかった。Orz
0030デフォルトの名無しさん
2011/02/10(木) 08:41:15ちゃんと見てないけど型にしろ定数にしろ
template に渡すものが違えば別の型になるよ。
0032デフォルトの名無しさん
2011/02/12(土) 10:48:21別スレッドから、親スレッドのGUI部品にアクセスするには、どういった手法があるのでしょうか?
0033デフォルトの名無しさん
2011/02/12(土) 11:13:490034デフォルトの名無しさん
2011/02/12(土) 11:22:18○○相談室じゃないんだから。
003532
2011/02/12(土) 11:40:57すみません。別スレッドは常に特定の通信用ポートにバインドされていて常時Listen状態で、基本的に終了しません。
必要なログ情報を、メインスレッドのリストボックスに吐き出していく仕様です。
0036デフォルトの名無しさん
2011/02/12(土) 12:08:12003732
2011/02/12(土) 12:28:39キューも考えました。
子スレッドからキューに書き込んで、メインスレッドからキューを読み込む。
でもメインスレッドを、キューを読むループ状態にしてしまって、GUIイベント処理って可能でしょうか?
C#だとデリゲートがあるけど、デリゲートがない言語だとどうやって実装してるのでしょうか。
0038デフォルトの名無しさん
2011/02/12(土) 12:45:43とにかくUIスレッドのメッセージループと同期しなきゃ始まらんだろ。
同期方法はGUIライブラリが提供してるからドキュメント読め。
C++でスレッドは規格外だからC#みたいな標準的な方法なんてのはないよ。
だからスレ違い。
0039デフォルトの名無しさん
2011/02/12(土) 23:51:05デリゲートってスレッドで実装されてんじゃないの?
0040デフォルトの名無しさん
2011/02/13(日) 04:06:350041デフォルトの名無しさん
2011/02/13(日) 04:08:090042デフォルトの名無しさん
2011/02/13(日) 16:48:370043デフォルトの名無しさん
2011/02/13(日) 18:15:33どゆこと?
0044デフォルトの名無しさん
2011/02/16(水) 06:36:55以下のような感じで「型"void (test2::*)(aaa&, test<aaa>::iterator)"の引数は型"void (*)(aaa&, test<aaa>::iterator)"のパラメーターと互換性がありません」というエラーが出ます
どうすればメンバ関数を関数に引数として渡せますか?
Visual C++ 2010使ってます
//test.h
template < class T > class test {
public:
class iterator {
public:void yobidashi( void (*function)( T&, iterator ) ){}
}
}
//hoge.h
#include <test.h>
struct aaa {
・・・
}
typedef test<aaa> testaaa;
//test2.h(実際はヘッダとソース分けてます)
#include <hoge.h>
class test2 {
private:
void func( aaa& a, iterator ite ) {}
public:
void zikkou(){
testaaa::iterator ite;
ite.yobidashi(func);
}
}
0045デフォルトの名無しさん
2011/02/16(水) 07:08:24std::bind と std::function を使う
//test.h
template < class T > class test {
public:
class iterator {
public:void yobidashi( std::function<void ( T&, iterator )> function ){}
}
}
//hoge.h
#include <test.h>
struct aaa {
・・・
}
typedef test<aaa> testaaa;
//test2.h(実際はヘッダとソース分けてます)
#include <hoge.h>
class test2 {
private:
void func( aaa& a, iterator ite ) {}
public:
void zikkou(){
testaaa::iterator ite;
using namespace std::placeholders;
ite.yobidashi(std::bind(func, _1, _2));
}
}
方法2. void func( aaa& a, iterator ite ) {} -> static void func( aaa& a, iterator ite ) {} に変更
0046デフォルトの名無しさん
2011/02/16(水) 07:10:070047デフォルトの名無しさん
2011/02/16(水) 09:48:18標準だと &func じゃメンバ関数へのポインタにはならないよ。 VC++ だと通るみたいだけどね。
&test2::func って書かないと。
0048デフォルトの名無しさん
2011/02/16(水) 09:54:130049デフォルトの名無しさん
2011/02/16(水) 13:02:41005044
2011/02/16(水) 14:19:11方法1だと
void yobidashi( void (*function)( T&, iterator ) ){}
void yobidashi( int (*function)( T&, iterator ) ){}
void yobidashi( void (*function)( T& ) ){}
void yobidashi( int (*function)( T& ) ){}
みたいにいろいろ用意したいときできないようですし
方法2だとtest2::funcにおいてthis->・・・のようなアクセスができないようです
すいません普通の関数ポインタと同じ程度に考えていたのでここまでいろいろな制約ができると思わず詳しく書きませんでしたが
様々な関数型で呼び出しできてthis->・・・でアクセスすることもできる方法はないでしょうか
0051デフォルトの名無しさん
2011/02/16(水) 15:05:43zikkouでイテレータからTを得てfuncを呼び出すんじゃいかんのか
0052デフォルトの名無しさん
2011/02/16(水) 17:51:380053デフォルトの名無しさん
2011/02/16(水) 19:18:46将棋盤のような8方向に移動できる連結リスト構造を作っていて
イテレータで直線的な移動はできるのですが周りの8マスに同じ処理するときは関数呼び出しで効率よくできないかと思いまして・・・
>>52
もう少し詳しく教えてもらえないでしょうか
0054デフォルトの名無しさん
2011/02/16(水) 20:20:27void yobidashi( std::function<int ( T&, iterator )> f ){}
void yobidashi( std::function<void ( T& )> f ){}
void yobidashi( std::function<int ( T& )> f ){}
でいいじゃん
0055デフォルトの名無しさん
2011/02/16(水) 20:21:300056デフォルトの名無しさん
2011/02/16(水) 23:11:14それだとbindで関数渡そうとしたとき複数のインスタンスが引数リストと一致しますてなってうまく判断してくれません
>>55
理解力がなくてすいません
それは何をしようとしているのかもう少し詳しく教えてもらえませんか
0057デフォルトの名無しさん
2011/02/16(水) 23:35:17こんな演算子作って、複素数で好きな方向に進めるように指定したらどう?
iterator& operator+=(const complex<int>& direction)
0058デフォルトの名無しさん
2011/02/17(木) 01:27:49イテレータからTを得てfuncを呼び出すんじゃいかんのか
0059デフォルトの名無しさん
2011/02/17(木) 02:02:42{
時間のかかる処理
}
static func()
{
task();
}
main()
{
CreateThread(NULL, func…);
CreateThread(NULL, func…);
}
この時、task内のローカル変数って、一つ目と二つめのスレッドで独立しているのでしょうか?
ふと迷ったのでよろしくお願いします。
0060デフォルトの名無しさん
2011/02/17(木) 02:18:30スレッド関連はいまのところ実装依存。
自動変数にスタックを使う典型的な実装では、 static と指定しない限りは独立したものになる。
0061デフォルトの名無しさん
2011/02/17(木) 20:44:300062デフォルトの名無しさん
2011/02/17(木) 22:04:160063デフォルトの名無しさん
2011/02/17(木) 22:20:34atomic int count;
みたいな
0064デフォルトの名無しさん
2011/02/17(木) 22:31:34その変数を使った処理はすべてアトミックに処理されるってこと?ならずいぶんワイルドである。
0065デフォルトの名無しさん
2011/02/17(木) 22:33:040066デフォルトの名無しさん
2011/02/17(木) 22:42:01軽く死ねるな
0067デフォルトの名無しさん
2011/02/19(土) 05:03:05テンプレートクラス化したものを作ってみたんですが、VC2008Expressでは通るものの
Codepadやideoneに貼るとエラーになりました。
http://codepad.org/aB4RFpdY
色々いじってみたんですが、なぜエラーになるのかよくわかりません・・・
0068デフォルトの名無しさん
2011/02/19(土) 09:17:12const Derived *p = static_cast<const Derived *>(this);
const has_dependency_pointer<typename T::__base_t> *dp = p;
return *static_cast<T *>(dp->m_pDependingObject);
006967
2011/02/19(土) 09:51:10ベースクラスのメンバを::でアクセスするのがダメだったんですね。
テンプレートの解析周りとも絡んでるのかな・・・調べてみます。
007067
2011/02/19(土) 11:21:21>>68のようにポインタを介すか、もしくはmain関数内で
lexical_castにGetDependingObject()の戻り値を直接渡さず
変数を介して渡せば大丈夫でした
0071デフォルトの名無しさん
2011/02/19(土) 12:55:44Derived:: 外せば通った。
http://codepad.org/vizevSF9
コンパイラさん的には Derived の中身を知らない段階で Derived::has_dependency_pointer が何かを知る必要があるんだけど、
何も付けないとメンバだとして認識され、typename 付けると型として、template 付けるとメンバテンプレートとして認識される。
今回そのどれとも違う(has_dependency_pointer<...> で型として認識させたい)けど出来なさそう。Derived 外して通るしね。
007267
2011/02/19(土) 13:59:13いつのまにかDerived::外してましたorz
コンパイラの解析順序は勉強不足でわからないんですが、
DerivedのポインタなのにDerived::で型指定は明らかにおかしいですね。外したらlexical_castに直接渡そうが大丈夫でした。
ありがとうございました。
007371
2011/02/19(土) 14:17:07DR176 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#176 が出ていて
14882:2003 だと 14.6.1 で Derived::has_dependency_pointer<...> の使い方も可能と明記されているっぽい。
GCC でこの DR への対応は 4.5 http://gcc.gnu.org/gcc-4.5/changes.html でされていると書いているが
gcc 4.5 以降でも完全には対応できていないみたい。
007467
2011/02/20(日) 05:30:54.89ありがとうございました。
0075デフォルトの名無しさん
2011/02/20(日) 10:27:07.290076デフォルトの名無しさん
2011/02/20(日) 22:20:57.52- a.h -
namespace NS {
class A {};
extern A a;
// aを使って何かする
}
- a.cpp -
#include "a.h"
using namespace NS;
A a;
int main() {
a;
return 0;
}
↑のコードではaが曖昧だとしてコンパイルエラーが出ます。
これについてのC++の仕様などが説明してあるようなところがありますでしょうか?
0077デフォルトの名無しさん
2011/02/20(日) 22:24:48.98NS::a と ::a の2つ宣言して、 using namespace NS したらどっちかわかんなくなるのは当然だと
思うんだけど、それ以外に何か説明が要るの?
0078デフォルトの名無しさん
2011/02/20(日) 22:39:01.58つまり
NS::A NS::a
と、
NS::A ::a
の違いってことでしょうか。
usingディレクティブではインスタンス側には適用されないということですか?
usingディレクティブが良く分かっていません。
0079デフォルトの名無しさん
2011/02/20(日) 22:44:26.85http://ja.lmgtfy.com/?q=C%2B%2B+using+%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96
個々の名前の解決に使われるだけ。型名と変数名の名前解決はそれぞれ別。
0080デフォルトの名無しさん
2011/02/20(日) 22:55:10.07ありがとうございます。
おかげでようやく意味がわかりました。
usingディレクティブの意味を誤解していたようです。
0081デフォルトの名無しさん
2011/02/21(月) 00:46:08.17namespace A { int x = 1; }
using namespace A;
extern int x; // 問題の行
int x = 2;
int main() { std::cout << x << "\n"; }
"問題の行"がある時はあいまいエラー、
ないときは::xがA::xを隠蔽して正常動作。
"問題の行"の x はどっちの x を指してるんじゃろ?_?
0082デフォルトの名無しさん
2011/02/21(月) 01:05:06.98コンパイラ何使ってる?
余計に重複した宣言の有無は名前検索には影響しないから、
↓のとおりエラーになるのが正解。
http://codepad.org/3Joye0c4
0083デフォルトの名無しさん
2011/02/21(月) 01:52:31.00C++ はゼロオーバーヘッドの原則が〜って言われるけど、
malloc で組んでた動的配列を std::vector に置き換えることはこの原則に反しないの?
std::vector<int> が領域確保後にゼロクリアするオーバーヘッドは無視できないと思うんだけど
何か勘違いしてるかな…
0084デフォルトの名無しさん
2011/02/21(月) 02:52:04.81{
public:
T():x(0),y(1){}
union
{
int x;
int y;
};
};
こういうのは問題ありますか?
unionの初期化はどうするのが一般的でしょうか?
0085デフォルトの名無しさん
2011/02/21(月) 07:21:46.46reserve() じゃダメ?
0086デフォルトの名無しさん
2011/02/21(月) 07:38:40.91コンパイラ何使ってる?
一見して何がしたいのかわからん。
↓予想通りコンパイルエラーになった。
http://codepad.org/J2cLF0Hp
0087デフォルトの名無しさん
2011/02/21(月) 07:53:34.52BCCです。
codepadではエラーだったのですが、BCCでは通りました。
必ずエラーになると定義されていてBCCがおかしいのか、
定義されていない動作なのか分からなかったので。
それでなにかしたかったわけではなく、単純な疑問です。
BCCだと初期化後の値は1でした。
0088デフォルトの名無しさん
2011/02/21(月) 07:58:00.07順番に評価されるから 1 になるのを期待するのはわからんでもないけど、
それなら y(1) だけでいいじゃない、っていう。
0089デフォルトの名無しさん
2011/02/21(月) 08:01:42.90単純な疑問です。
宣言と実体を別に書いた場合、この x は初期化してたっけ?っていうのもあると思いますし。
0090デフォルトの名無しさん
2011/02/21(月) 08:03:22.09なら規格見れ。
0091デフォルトの名無しさん
2011/02/21(月) 08:48:25.31それってメモリ確保するだけで、
resize したときにゼロクリアされるでしょ
0092デフォルトの名無しさん
2011/02/21(月) 09:04:44.70勘違いしてないか?
0093デフォルトの名無しさん
2011/02/21(月) 09:07:34.14まさか不定な値を使いたいわけじゃないんだよね?
どんなケースを想定してるのか具体的な例を出してもらわないと伝わらないかも。
0094デフォルトの名無しさん
2011/02/21(月) 09:11:37.78例えば 1MB のファイルを読み込みたいとして、1MB の領域を確保して使いたいとするじゃん
こういう場合どうする?resize するしかないよね?これだとゼロクリアが入ってしまってそれが無駄。
ゼロクリアの処理を回避して確保する方法ってある?
これだけなら new unsigned char[1024 * 1024] でいいけどさ、malloc / realloc や std::vector と違って後で拡張できないじゃん。
0095デフォルトの名無しさん
2011/02/21(月) 09:14:49.010096デフォルトの名無しさん
2011/02/21(月) 09:21:49.580097デフォルトの名無しさん
2011/02/21(月) 09:46:54.72なるほどね。
うまい方法は無いかなぁ。
特殊化の穴をつけばいけるかもしれないけど、特定の実装に依存したものにしかならないだろうな。
0098デフォルトの名無しさん
2011/02/21(月) 10:36:27.72ゼロクリアがいやならinsertで初期化すればいい
それもいやなら……どうすればいいんだろうな
0099デフォルトの名無しさん
2011/02/21(月) 11:46:25.29予めサイズがわからないなら諦めてvectorでresizeする。どうせオーバーヘッドとしては
大したものでもない。
0100デフォルトの名無しさん
2011/02/21(月) 12:28:02.11> C++ はゼロオーバーヘッドの原則が〜って言われる
Cと同じ処理をするにあたり、上記原則を満たさない場合があるってことでいいのかな
0101デフォルトの名無しさん
2011/02/21(月) 12:30:21.64未初期かなのが欲しければ malloc() すりゃいいんだし。
0102デフォルトの名無しさん
2011/02/21(月) 12:40:05.80メモリ確保を行うのは Allocator の役割だ。
0103デフォルトの名無しさん
2011/02/21(月) 12:40:35.010104デフォルトの名無しさん
2011/02/21(月) 12:53:18.02コンストラクタも呼ばていないのにアクセスは可能でコピーできる
それでいて不定値ならばデストラクタを呼んではいけない
そんなコンテナは設計が難しすぎる
0105デフォルトの名無しさん
2011/02/21(月) 12:58:56.740106デフォルトの名無しさん
2011/02/21(月) 13:01:38.10コンストラクタが呼ばれないのにデストラクタが呼ばれるのは何か変ではないかと
0107デフォルトの名無しさん
2011/02/21(月) 13:02:19.920108デフォルトの名無しさん
2011/02/21(月) 13:08:52.54コンテナにアロケータの仕事のみをさせるのはそもそもおかしい
などとかいていたら>>107が颯爽と
0109デフォルトの名無しさん
2011/02/21(月) 15:00:11.79オーバーヘッドを許さないならrealloc()で拡張なんてできない。
> C++ はゼロオーバーヘッドの原則が〜
これってC++の言語仕様を決める奴らの指針でしょ。
0110デフォルトの名無しさん
2011/02/21(月) 15:08:13.86拡張だけですむなら拡張を、無理なら別のアドレスに確保をという挙動
0111デフォルトの名無しさん
2011/02/21(月) 16:27:43.98俺は自作してるよ。
0112デフォルトの名無しさん
2011/02/21(月) 20:10:01.630113デフォルトの名無しさん
2011/02/21(月) 20:20:07.830114デフォルトの名無しさん
2011/02/21(月) 20:32:27.95これを承認したやつの髪の毛をむしりたくなるよ
0115デフォルトの名無しさん
2011/02/21(月) 20:41:06.980116デフォルトの名無しさん
2011/02/21(月) 20:47:20.280117デフォルトの名無しさん
2011/02/21(月) 23:37:52.480118デフォルトの名無しさん
2011/02/22(火) 08:11:03.83よく分からん。
未初期化な部分への代入か未初期化な部分へのコピーコンストラクトかの違いになるだけじゃないの?
0119デフォルトの名無しさん
2011/02/22(火) 08:53:53.16mmap使おうよ。
0120デフォルトの名無しさん
2011/02/22(火) 11:36:01.96C スタイルの関数と組み合わせて使いたいって話だろう。
0121デフォルトの名無しさん
2011/02/22(火) 13:37:26.22クラスにしたくは無いし、引数を多くしたくないんですけどどういう解決策がありますか?
ラムダ式は再帰できないのでわかりません。
引数を構造体にしたらどんな関数も引数一つで十分ですか?
0122デフォルトの名無しさん
2011/02/22(火) 13:40:36.37静的変数使えば?
最後の質問は、関数の仕様によるとしか言えない。
0123デフォルトの名無しさん
2011/02/22(火) 13:43:40.80静的変数は関数を始めに実行するときに初期化されて
終了するまで存在し続けるのですよね。
0124デフォルトの名無しさん
2011/02/22(火) 15:55:18.60そうです。例えばsocketからのrecvとか。
0125デフォルトの名無しさん
2011/02/22(火) 23:12:41.010126デフォルトの名無しさん
2011/02/22(火) 23:37:47.40データ読込は無駄なコストじゃないから。
無駄なメモリクリアやメモリコピーを排除したいのです。
0127デフォルトの名無しさん
2011/02/22(火) 23:51:53.52毎度のことながら馬鹿の考え休むに似たり。
0128デフォルトの名無しさん
2011/02/22(火) 23:55:00.620129デフォルトの名無しさん
2011/02/23(水) 00:03:11.290130デフォルトの名無しさん
2011/02/23(水) 00:46:01.41本当にそうなら楽なんですけどね。
ギリギリの高パフォーマンスを求められるようなケースでは
無駄なメモリアクセスは極力排除したくなりますよ。
パフォーマンス実測で比較した結果として。
0131デフォルトの名無しさん
2011/02/23(水) 00:48:18.26値わたしが基本のSTLコンにそこまでパフォ求めても。
まるでニュにマロ並みの速度を求めるようなものだよ
0132デフォルトの名無しさん
2011/02/23(水) 00:55:05.650133デフォルトの名無しさん
2011/02/23(水) 00:57:44.49non PODクラスはさすがに初期化しないわけにはいきません。
初期値指定が無い場合デフォルトコンストラクタが呼ばれ
る様にすれば問題ないです。
0134デフォルトの名無しさん
2011/02/23(水) 00:58:21.160135デフォルトの名無しさん
2011/02/23(水) 01:04:38.920136デフォルトの名無しさん
2011/02/23(水) 01:05:35.76STLコンテナにしたい理由は既存のSTLコンテナ対象のライブラリを
使用したいからというのが大きいです。
newや他のメモリプールをMyStlLikeVectorClassでラップすること
のコストは無駄なメモリアクセスを発生させることに比べれば微々
たるものですよ。特に処理するデータブロックが大きい場合。
0137デフォルトの名無しさん
2011/02/23(水) 01:08:04.030138デフォルトの名無しさん
2011/02/23(水) 01:10:42.43vectorでいいから、使う分をはじめに十分確保しとけ
0139デフォルトの名無しさん
2011/02/23(水) 02:49:30.47十分速いのかもしれないが、ある面で見ると遅くなっていることは否めないと。
0140デフォルトの名無しさん
2011/02/23(水) 02:59:03.280141デフォルトの名無しさん
2011/02/23(水) 03:08:53.93「STL」ってコンテナやらアルゴリズムやらごちゃごちゃ入ってるものを指して
「遅い」と断じるのに無理があるのは明らかだろう。
横着せずに「未初期化な配列を使っていたところをstd::vectorで置き換えたら
遅くなることがある」と正確に覚えろ。
0142デフォルトの名無しさん
2011/02/23(水) 03:22:20.380143デフォルトの名無しさん
2011/02/23(水) 03:26:34.51配列の代替手段としてvectorを使うと速度低下を招くことには異論ないでしょ?
ある局面においては無駄な処理が行われてしまうことは認めなければならないし、
その速度差が重要な場面では、STLは遅いと断ずることは間違いじゃない。
現に、彼はその無駄な処理の有無によって生まれる速度差が有意なものであると感じてるわけで。
その上で、vectorの利便性を損なうことなく、初期化を省く手法はないのかと尋ねているのでは?
0144デフォルトの名無しさん
2011/02/23(水) 03:26:45.680145デフォルトの名無しさん
2011/02/23(水) 03:29:45.50>>130
0146デフォルトの名無しさん
2011/02/23(水) 03:39:55.500147デフォルトの名無しさん
2011/02/23(水) 03:47:24.21> 配列の代替手段としてvectorを使うと速度低下を招くことには異論ないでしょ?
↓
> その速度差が重要な場面では、STLは遅いと断ずることは間違いじゃない。
これが明らかな論理の飛躍だと言っている。
vector についての事実があったとしても、それを以って algorithm や iterator を
含めたライブラリ全体の速度の判断材料にはなり得ない。
いい加減にSTLとかいう妙なくくりを使うのもやめてほしい。
0148デフォルトの名無しさん
2011/02/23(水) 05:29:08.27BufValue() {}
char c;
};
std::vector<BufValue> buffer;
これはコンストラクタがあるからだめなんだっけ?
0149デフォルトの名無しさん
2011/02/23(水) 07:22:24.60>パフォーマンス実測で比較した結果として。
具体的に何をどう比較したんだ?
やりもしないで、いい加減なことを言うのはやめた方がいいぞ。
0150デフォルトの名無しさん
2011/02/23(水) 07:44:31.59for( int i = 0; i < 100000; ++i ) {
for( int j = 0; j < 1000000; ++j ) {
std::vector<int> foo(1000000); }}
Ω<遅い、耐えられん!
そりゃ遅くなるよ、としか言えない
0151デフォルトの名無しさん
2011/02/23(水) 09:31:13.32「既存のSTLコンテナ対象のライブラリ」がvectorしか受け付けないのが間違ってる。
「STLコンテナ」ってのはSTLの作法(beginとendの間をiteratorで回せるとか)を満たすコンテナ(当然自作のを含む)であって、特定のクラスではないよ。
0152デフォルトの名無しさん
2011/02/23(水) 10:33:16.81メモリの初期化コストが気になるくらいって
そんな大容量メモリ?
アーキテクチャ的にメモリが遅い?
前者ならそこそこの速度がありそうだし、
後者ならもっと下のレベルで裏技があることが多いような。
まあ、そんなギリギリな環境で STL 使うなやって思うけど。
STL が悪いって話じゃなくて、事実として、その環境では速度的な問題が出てるんでそ?
0153デフォルトの名無しさん
2011/02/23(水) 11:34:11.050154デフォルトの名無しさん
2011/02/23(水) 11:44:02.86俺のことかああああああああああああああああああああ
図星うわああああああああああああ
0155デフォルトの名無しさん
2011/02/23(水) 11:59:50.850156デフォルトの名無しさん
2011/02/23(水) 13:12:27.36なるという明白な事実も理解できないゆとりばかり。
0157デフォルトの名無しさん
2011/02/23(水) 13:15:38.550158デフォルトの名無しさん
2011/02/23(水) 13:20:45.200159デフォルトの名無しさん
2011/02/23(水) 13:29:03.61案件ならなんでC++使うの?C#でも使えばいいじゃない。
0160デフォルトの名無しさん
2011/02/23(水) 13:43:46.13自分のアルゴリズムが複雑怪奇か、何もしてないだけ。
やらなくていいのに毎回メモリ確保してるとか。使い回せばいいのに。
0161デフォルトの名無しさん
2011/02/23(水) 13:45:53.39vector使う限りは回避不可能の具体例あげてみろ。
0162デフォルトの名無しさん
2011/02/23(水) 14:32:12.91確かに、その後に続くだろう1万回のメモリアクセスを加味して、
10001回のメモリアクセスが10002回になるなんてとんでもない話だよな
>>161
ホットスポット?
0163デフォルトの名無しさん
2011/02/23(水) 14:51:58.31とおもってくれ
0164デフォルトの名無しさん
2011/02/23(水) 14:53:53.01ホットスポット
【プログラミング】
能無しによって書かれた複雑怪奇で冗長的なプログラムのうち、特に処理が集中していて、その上効率悪く動いているサイテーサイアクの部分。
http://glossary.tank.jp/t05F4.html
Parallel Amplifierは、解析対象アプリケーションを実行し、各関数ごとにどれだけの時間が掛かっているかを解析し、ビジュアルに表示することで、開発者がボトルネックを見分けられるようにしてくれます。
http://codezine.jp/article/detail/5284?p=2
0165デフォルトの名無しさん
2011/02/23(水) 14:59:09.13ホットスポットはCPUの処理時間。
CPU処理の集中がホットスポット。
0166デフォルトの名無しさん
2011/02/23(水) 15:03:02.290167デフォルトの名無しさん
2011/02/23(水) 15:04:35.490168デフォルトの名無しさん
2011/02/23(水) 15:27:04.92同じデータを1万回もアクセスしなきゃいけないってどんな場合だよ?
そういう場合なら確かに初期化コストなんて誤差の範囲だね。
0169デフォルトの名無しさん
2011/02/23(水) 15:32:43.190170デフォルトの名無しさん
2011/02/23(水) 15:44:50.59Core i7の2600番台を買わせろって
そんなにべらぼうに高いわけではないし、最悪待ってりゃ終わる事
0171デフォルトの名無しさん
2011/02/23(水) 15:53:29.72vectorの初期化がボトルネックになるって、くそコードのせいだろ。
0172デフォルトの名無しさん
2011/02/23(水) 15:55:52.78vector確保しかしていない OR vector確保回数が多く大半
0173デフォルトの名無しさん
2011/02/23(水) 16:24:49.90てか代替する必要がない。malloc()のままでおk。
そもそもクリティカルな所で動的確保するのがおかしい。
0174デフォルトの名無しさん
2011/02/23(水) 16:33:31.95した上でstd::vectorの無駄な初期化コストを省きたいということな
んだが、、、こんな不毛な議論になるとはw
初期化しないカスタムvector自作なんてnew[]を直接使うなんて保守
性の悪いやりかたがもたらす結果に比べれば遙かに楽なことなんだし。
0175デフォルトの名無しさん
2011/02/23(水) 16:41:43.05二年前から自作してたわー
0176デフォルトの名無しさん
2011/02/23(水) 16:52:11.35それをvectorに渡せばいいじゃないか^^
0177デフォルトの名無しさん
2011/02/23(水) 17:13:03.30当然vectorの全機能搭載済みだよな?
0178デフォルトの名無しさん
2011/02/23(水) 17:15:08.72高パフォーマンスだったら、OSの機能、ハードウェアの機能を直に使えよ。winAPI、アセンブラなど。
0179デフォルトの名無しさん
2011/02/23(水) 17:21:17.68おいおい車輪の再発明はやめようぜ
プログラマも時間と金には限界があるんだぜ
0180デフォルトの名無しさん
2011/02/23(水) 17:24:32.57この部分だけやればOK
> メモリの初期化命令をあっさり無視する独自のallocatorクラスを記述して
> それをvectorに渡せばいいじゃないか^^
0181デフォルトの名無しさん
2011/02/23(水) 20:26:59.64前提条件を明確にせずに方法論だけ語り出す奴らって、何の役にも立たないクズなんだが。
0182デフォルトの名無しさん
2011/02/23(水) 21:04:07.70不定値の特定が難しいとデバッグが大変だ。
0183デフォルトの名無しさん
2011/02/23(水) 21:20:51.36パーツとして使うものなんだからできるだけ無駄は排しておきたいというのはおかしなニーズだとは思わない。
全体に寄与するかどうかは別だけど、寄与しないから無駄だと思ってる奴は馬鹿が無駄に工数投入してるって
せせら笑っとけばいいだけなんじゃないの?
他人が無駄な工数を投入しているのが許せないとかそんな潔癖症でもないだろ、おまいら。
個人的には標準が要求する Allocator とか Sequence の要件を満たして実装できるのかが興味あるな。
0184デフォルトの名無しさん
2011/02/23(水) 21:40:19.97動的に複数回の変更しなければ、どんなメモリ確保の仕方でも大差つかない。
vectorを多めにとって置きresizeつかえ。
拡張する自体になったとしても全体の影響は少ない。
初期化コストとかアホが考えること。
0185デフォルトの名無しさん
2011/02/23(水) 21:44:17.60現代のPCはマルチタスクだ。一つのソフトが大きくメモリ占有したら
OS全体で仮想メモリの使用が増えて遅くなる。
低メモリを重視して、多くてもメモリ50Mくらいですむようにアルゴリズム考え直せ。
0186デフォルトの名無しさん
2011/02/24(木) 00:03:01.00ソフトを作ると大幅に速度が落ちるぞ
Photoshopなどはこれを回避するために特別な方法を使っている
0187デフォルトの名無しさん
2011/02/24(木) 00:36:58.55やたらランダムにアクセスするアルゴリズムは対象サイズが大きくなると駄目だろうなあ
0188デフォルトの名無しさん
2011/02/24(木) 06:41:54.81コンシューマ機のロード処理とかで極力余分なコストを省きたいことがあるけど
大抵はboost::scoped_array/boost::shared_arrayで問題ないなあ
サイズが変わるのはロードしなおすときくらいだからreset()で十分足りるし
0189デフォルトの名無しさん
2011/02/24(木) 09:16:50.11例えば int型だったら int Class::member = 0 とかやればいいですよね
でも listの場合だと list<Class1> Class::member = ? となってできません
list じゃなくても普通のClass も同じことですが
0190デフォルトの名無しさん
2011/02/24(木) 09:25:54.99コンストラクタがあるんで初期化子がなければデフォルト初期化でちゃんと空の list が
用意される。引数付きで初期化したければ ...::member(...); とすればいい。
0191デフォルトの名無しさん
2011/02/24(木) 12:29:08.77毎フレいじるならともかく。
0192デフォルトの名無しさん
2011/02/24(木) 12:34:48.70pool使ったアロケータをtemplate型に与えてたから速度にそんなに影響しないと思ってたけど結構きつかったよ。
ごめんねコンピューター。
0193デフォルトの名無しさん
2011/02/24(木) 14:44:36.37for文で一要素ずつ0埋めしてたりするからね。要注意ですよ。
0194デフォルトの名無しさん
2011/02/24(木) 14:47:31.96それでもアプリケーションレベルのプログラマんは十分な性能だと思うけど
0195デフォルトの名無しさん
2011/02/24(木) 17:12:44.800196デフォルトの名無しさん
2011/02/24(木) 22:38:41.30C++でphpの関数がつかえるヘッダファイルなどありますか。
0197デフォルトの名無しさん
2011/02/25(金) 00:07:58.33何がしたいのか気になる
0198デフォルトの名無しさん
2011/02/25(金) 00:20:02.240199デフォルトの名無しさん
2011/02/25(金) 00:21:52.07C++関係ないじゃん
0200デフォルトの名無しさん
2011/02/25(金) 00:26:21.90ネイティブのEXEを作りたいです。
0201デフォルトの名無しさん
2011/02/25(金) 00:36:24.49どこが使える、優れているんだら?
0202デフォルトの名無しさん
2011/02/25(金) 00:36:51.93C言語系列は知ってて損はないよ。お手軽にC#っててもあるぞー。
0203デフォルトの名無しさん
2011/02/25(金) 00:38:01.545年後には確実に役に立たない知識になるし
0204デフォルトの名無しさん
2011/02/25(金) 00:39:16.190xは完成しているんだろうか
0205デフォルトの名無しさん
2011/02/25(金) 00:40:19.310206デフォルトの名無しさん
2011/02/25(金) 00:43:39.05MS製の言語なんてそんなもんだよ
それか名前は同じでも中身は全く別物になってたりする
0207デフォルトの名無しさん
2011/02/25(金) 00:47:02.96飽きたらサポートされなくなる可能性高いよね
J++も消えたし。J DirectとかWFCとか覚えた人はご愁傷様って感じ。
0208デフォルトの名無しさん
2011/02/25(金) 00:50:55.38言語の性能・使いやすさとコンパイラ・翻訳は別。
それにphpがDirectX、winAPIを扱えるように拡張することも開発者がやろうとしたらできる事。
0209デフォルトの名無しさん
2011/02/25(金) 00:57:04.80貴様はMonoとvalaを侮辱したな…
.netはプラットフォームにかなりべったりだけど、
C#自体はかなりイカした言語だと思うぜ。
そうね、Javaよか幾分マシなくらいな
でもこれってすごい事よ。
0210デフォルトの名無しさん
2011/02/25(金) 01:17:10.24まー、最近だとC++でもスマートポインタ入っていくらかマシになったけど。
0211デフォルトの名無しさん
2011/02/25(金) 02:27:34.705年後だと0F超えてるw
0212デフォルトの名無しさん
2011/02/25(金) 03:34:21.82phpに統一したい、C++を使いたいってことでいいのかな。
なら、phpのモジュールをC++で書けばおk。
0213デフォルトの名無しさん
2011/02/25(金) 03:36:43.610214デフォルトの名無しさん
2011/02/25(金) 04:02:10.06n進数としてn→∞ならあらゆる自然数を10-1で表現できるもんなぁ…。
0215デフォルトの名無しさん
2011/02/25(金) 09:12:44.67PHP は処理系が一つしか無い訳だから、それは当て嵌まらない。
現実を無視して、過度な一般化をしても意味は無い。
0216デフォルトの名無しさん
2011/02/25(金) 09:44:55.45現在、次の法則でコンテナが増えていってます。
std::vector<AClass> aList;
std::vector<BClass> bList;
std::vector<CClass> cList;
exec1(){
for_each(aList.begin(),aList.end(),std::mem_fun_ref(&AClass::exec1));
for_each(bList.begin(),bList.end(),std::mem_fun_ref(&BClass::exec1));
for_each(cList.begin(),cList.end(),std::mem_fun_ref(&CClass::exec1));
}
exec2(){
for_each(aList.begin(),aList.end(),std::mem_fun_ref(&AClass::exec2));
for_each(bList.begin(),bList.end(),std::mem_fun_ref(&BClass::exec2));
for_each(cList.begin(),cList.end(),std::mem_fun_ref(&CClass::exec2));
}
10個20個と、今後もこの法則で増えていきそうなので、
コンテナ自体をコンテナに詰め込んでまとめてexe1(),exe2()などを呼ぼうかと
思ったんですが、よく考えると、型が違うのでコンテナに入れられないですよね。
すっきりする方法ってありますでしょうか?
0217デフォルトの名無しさん
2011/02/25(金) 10:11:10.34public:
virtual ~Base(){}
virtual void exec() = 0;
};
class AClass : public Base
{
public:
virtual void exec()
{
}
};
std::vector<Base*> aList;
これでは?
0218デフォルトの名無しさん
2011/02/25(金) 13:09:28.31実は、newを使う実装に抵抗があってずっと避けていたのですが、
確かに構造的にはスッキリしそうですね。
これを機に、スマートポインタを使って
ご提案いただいた方法で挑戦してみます!
有難うございました。
0219デフォルトの名無しさん
2011/02/28(月) 12:50:58.960220デフォルトの名無しさん
2011/02/28(月) 12:52:56.62どのレベルで言ってるか良くわからないが、初歩であれば、
CHoge Hoge(Arges);
って言う感じじゃね?コンストラクタもそれように書く!
0221デフォルトの名無しさん
2011/02/28(月) 12:54:44.59ありますよ。
class C { public: C(int v = 0) {} };
0222デフォルトの名無しさん
2011/02/28(月) 13:35:44.38void function (Class Cデフォルト(引数)){}
のようなことですよ?
0223デフォルトの名無しさん
2011/02/28(月) 13:40:08.04訂正
0224デフォルトの名無しさん
2011/02/28(月) 13:50:29.87△ デフォルト引数でポインターではないクラスを初期化
○ ポインターではないクラス型の引数にデフォルト実引数を指定
ってことかな?
void function (int a=3 ,class C = C(...)){}
0225デフォルトの名無しさん
2011/02/28(月) 13:53:51.21ありがとうございます。
たぶんそれですが
初期化してからコピーで、厳密には初期化じゃないですよね。
0226デフォルトの名無しさん
2011/02/28(月) 13:55:55.06コピーじゃないよ。 operator = () が呼び出されたりはしない。
0227デフォルトの名無しさん
2011/02/28(月) 13:59:02.590228デフォルトの名無しさん
2011/02/28(月) 14:03:19.950229デフォルトの名無しさん
2011/02/28(月) 14:15:49.39コピーされるかどうかの話ならコピーコンストラクタが使われるかどうかを確認するべきでしょう。
0230デフォルトの名無しさん
2011/02/28(月) 14:20:37.93デフォルト引数は呼び出し元の引数の記述を省略できるだけで、動作に変化はないんじゃない?
規格は確認してないけど
0231デフォルトの名無しさん
2011/02/28(月) 17:27:15.170232デフォルトの名無しさん
2011/02/28(月) 17:37:56.02こう書いたとき、operator =() は呼ばれず、代わりにコピーコンストラクタが呼ばれる可能性がある
その上で、コピーコンストラクタを呼び出す処理を省略する実装が許されている、だっけ?
ちなみに参照のときってこう書けばいいの?
void function (int a=3 ,class &C = C(...)){}
0233デフォルトの名無しさん
2011/02/28(月) 17:47:05.12同じ「コピー」と呼ぶのはやめよう。ちなみにゆとりちゃんの勤めている会社はポプー。
C c;
C a( c ); // コピーコンストラクタの explicite な呼び出し
C a = c; // コピーコンストラクタの implicite な呼び出し
a = c; // コピー代入演算子の呼び出し
void f( C x = C() );
f( c ); // x はコピーコンストラクタの explicite な呼び出しで生成
f() // x は引数なしのコンストラクタの呼び出しで生成
見た目が同じでも意味が違うのであった。
0234デフォルトの名無しさん
2011/02/28(月) 17:48:24.81として扱って良いだったはず
0235デフォルトの名無しさん
2011/02/28(月) 17:56:25.84f( c ); // x はコピーコンストラクタの implicit な呼び出しで生成
の間違いですた^^
あと、implicit, explicit でつづりも間違い^^;;;;;
0236220
2011/02/28(月) 18:31:02.800237デフォルトの名無しさん
2011/02/28(月) 19:03:20.86ありがとう。
MyClass foo = MyClass();
と書いたとき、下記のいずれで実装してもよい、ですね。
・コンストラクタ + 代入演算子
・コピーコンストラクタ
0238デフォルトの名無しさん
2011/02/28(月) 19:19:33.370239デフォルトの名無しさん
2011/02/28(月) 19:26:40.34だめだこりゃ
0240デフォルトの名無しさん
2011/02/28(月) 19:33:44.130241デフォルトの名無しさん
2011/02/28(月) 19:35:36.930242デフォルトの名無しさん
2011/02/28(月) 22:38:27.36いつまでもコンパイラが枯れないね
0243デフォルトの名無しさん
2011/02/28(月) 22:39:22.390244デフォルトの名無しさん
2011/02/28(月) 23:02:51.530245デフォルトの名無しさん
2011/02/28(月) 23:04:54.080246デフォルトの名無しさん
2011/03/01(火) 17:38:46.26少なくとも2分冊、恐らく3分冊で、1冊が5cmほどで、カバーを外すと1冊が緑一色、1冊が青一色。
多分洋書の和訳。
STLについても書いてあったはず。
なんかうさぎと亀のシミュレーションとか、アキュムレータマシン(か、レジスタマシン)の仮想マシンとか書いてあったような。
すっごい面白かったはずなんですが、誰か書名を教えてくれませんか?
0247デフォルトの名無しさん
2011/03/03(木) 17:37:08.59Cで書くのと同じように関数内にゴリ押しで詰め込んだほうがいいですか?
0248デフォルトの名無しさん
2011/03/03(木) 17:39:19.110249デフォルトの名無しさん
2011/03/03(木) 18:24:57.05関数は作る。
クラスを作るかどうかは状況による。
使い捨てのクラスを作ることはない。
0250デフォルトの名無しさん
2011/03/10(木) 03:31:41.350251デフォルトの名無しさん
2011/03/10(木) 03:42:39.950252デフォルトの名無しさん
2011/03/10(木) 19:19:48.69http://ideone.com/ZdhCm
関数に渡す引数を柔軟にしたく、
コンストラクタの暗黙変換を活用するコードを書いたのですが、
テンプレート引数の型が派生関係にある型では
マッチしてくれないことが分かり困っています。
こういった場合の一般的な解決方法がありましたら教えてほしいです。
0253デフォルトの名無しさん
2011/03/10(木) 19:32:02.790254252
2011/03/10(木) 19:56:15.58ありがとうございます。が大変申し訳ないです説明不足でした。
引数を柔軟にというのは、複数の型から変換できるという意味合いです。
http://ideone.com/BxMks
・・ってああああ!分かってきました!
曖昧にしておきたいテンプレート引数に当たる部分は一旦Tで受けておいて、
更にそのTを関数オーバーロードを利用して具体的な型に近づくように
振り分けてあげれば良さそうですね!
・・ただこれって結構深いテンプレート深度だと書くの大変そうですよね。
これから試してみようと思いますが、このやり方しか方法は無いんでしょうか?
0255デフォルトの名無しさん
2011/03/10(木) 19:59:25.78class BaseWrapper{ }
template <class T>
struct Wrapper : public BaseWrapper { };
struct Hoge { };
void Func(const BaseWrapper& arg)
{
}
的な。
0256252
2011/03/10(木) 21:04:01.65ありがとうございます。ただ、意図しているところがちょっと分かりませんでした。
全ては私の説明が下手なせいで・・ごめんなさい。
一応>>254での方法で振り分けができたのですが、
なんだか多分スマートではない感じになりました・・。
http://ideone.com/svWr7
これで進めてみますが、もっと良い感じの
コードがありましたら教えてほしいと思います。
一旦これにて、皆さんどうもありがとうございました。
0257デフォルトの名無しさん
2011/03/10(木) 21:49:04.99ImplicitCasted Convert(int);
ImplicitCasted Convert(Hoge const &);
ImplicitCasted Convert(Wrapper<Hoge> const &);
template <class T> ImplicitCasted Convert(Wrapper< HogeHoge<T> > const &);
template <class T> void Func(T const & obj) {
ImplicitCasted const & ic = Convert(obj);
}
キャストなんてどうしようもない時だけにするものだから
キャストしまくる前提のクラス設計なんて最初から見直したほうがいい、と言いたいけど…
まあ、どうしてもやりたいなら、俺ならこうする
0258デフォルトの名無しさん
2011/03/12(土) 07:58:40.12継承なしに関数のオーバーライドって可能ですか?
つまり「 : public ClassName」を使わないで。
0259デフォルトの名無しさん
2011/03/12(土) 08:18:09.52無理じゃね
0260デフォルトの名無しさん
2011/03/12(土) 09:15:36.17さらに、サブクラスにスーパークラスのヘッダーファイルをインクルードも禁止なのです
0261デフォルトの名無しさん
2011/03/12(土) 09:35:47.580262デフォルトの名無しさん
2011/03/12(土) 11:40:51.21身近に相談出来るプログラマーなんていないからw
0263デフォルトの名無しさん
2011/03/12(土) 12:17:09.970264デフォルトの名無しさん
2011/03/12(土) 18:43:18.75オーバーライドの機能をすべて実現することはできないしね。
あと、C++のときはサブクラス、スーパークラスと呼ぶのはやめようぜ。
なんか肛門がぞくぞくする。
0265デフォルトの名無しさん
2011/03/13(日) 01:39:30.91その見つけたコードを書いてみるといいよ。
0266デフォルトの名無しさん
2011/03/13(日) 02:31:20.470267デフォルトの名無しさん
2011/03/13(日) 02:45:32.230268デフォルトの名無しさん
2011/03/13(日) 09:09:48.640269デフォルトの名無しさん
2011/03/13(日) 12:00:09.24仮想関数システムなわけだが。
継承関係の無いクラスの動的多態、ならFaith and Braveで記事があったと思う。
0270デフォルトの名無しさん
2011/03/13(日) 12:59:41.450271デフォルトの名無しさん
2011/03/13(日) 13:03:01.320272デフォルトの名無しさん
2011/03/13(日) 14:08:48.060273デフォルトの名無しさん
2011/03/13(日) 15:22:37.69もう少し正確な裏付け取るため別をあたってみたいと思います。
コード公開できるようになれば報告しに来ます!(`・ω・´)
因みに267は俺の発言ではないのです。そして関数ポインタなんて使ってませんw
0274デフォルトの名無しさん
2011/03/13(日) 16:04:34.93dereferenceした直接の要素へのポインタや参照もstd::vectorみたいに無効になるんでしょうか?
推測ですが、iteratorが無効になるのはランダムアクセスに使っているindexの配列の再構築が行われるからであって
要素そのもののメモリ空間の操作はないと思うのですが、実際はどうなんでしょう。
0275デフォルトの名無しさん
2011/03/13(日) 17:31:16.24「dequeはイテレータが無効になってもポインタや参照は無効にならない」
とEffectiveSTLに書いてあるけど。
つーわけで、Eff STLは持っとけ。
0276デフォルトの名無しさん
2011/03/13(日) 17:54:04.11ありがとうございます。
0277デフォルトの名無しさん
2011/03/14(月) 14:06:09.740278デフォルトの名無しさん
2011/03/14(月) 16:43:08.320279デフォルトの名無しさん
2011/03/15(火) 00:40:02.46{
sprintf(buf, "%*.*s", len, len, str + offset);
}
char buf[100];
func(buf, "12345", 4, 0);
puts(buf);
func(buf, "12345", 4, 1);
put(buf);
0280デフォルトの名無しさん
2011/03/15(火) 19:24:19.32順番がキモい
0281279
2011/03/16(水) 04:23:51.030282デフォルトの名無しさん
2011/03/17(木) 04:27:04.07vectorみたいに再配置が起きないの?
dequeってメモリ上連続していることが保証されてるんじゃないっけ。
0283デフォルトの名無しさん
2011/03/17(木) 04:28:24.250284デフォルトの名無しさん
2011/03/17(木) 17:25:17.40連続してねえよ
チャンク単位でバラバラ
operator[]が使えるってだけの話
0285デフォルトの名無しさん
2011/03/17(木) 19:02:32.27[]が定数時間でアクセス可能というところで、データ自体が連続領域なのかと勘違いしてた。
0286デフォルトの名無しさん
2011/03/17(木) 19:16:05.370287デフォルトの名無しさん
2011/03/17(木) 19:25:13.99static void Func()
{
static char buffer[1024];
}
と書いて複数のcppからインクルードすると、
staticなので内部リンケージということから考えて、
関数が複数コピーされて、
buffer[1024];は静的領域に複数確保されてしまいますか?
0288デフォルトの名無しさん
2011/03/17(木) 21:16:49.160289デフォルトの名無しさん
2011/03/17(木) 23:54:34.96ありがとうございます。
0290デフォルトの名無しさん
2011/03/18(金) 01:46:49.96例えばPythonとかだったらFTP鯖とかftplibモジュールとか使えばすぐ作れたりするけどC++だと全然どうやって作っていけば良いのか分からん。
入門書読み終えて立ち尽くしてる状態だわ
0291デフォルトの名無しさん
2011/03/18(金) 02:09:29.38OSの力を借りないと
0292デフォルトの名無しさん
2011/03/18(金) 09:21:00.53特にネットワークは環境依存プログラミングになりがちだから、
とりあえずクロスプラットフォームのライブラリさがすのベターでは
0293デフォルトの名無しさん
2011/03/18(金) 11:54:53.17どうもありがとう。
言語の勉強するんならとりあえず何か作れと良く言われるからDXライブラリとか外部のライブラリ使って何か作ってみる
0294デフォルトの名無しさん
2011/03/18(金) 13:45:05.74> C++って何でも出来るらしいけど何にも作れない。。。
真理。
0295デフォルトの名無しさん
2011/03/18(金) 13:45:54.15> DXライブラリ
Qtライブラリがおすすめな気がするけど。
DXもまあ勉強するならいいのかもしれないが、クロスプラットフォームじゃないしねぇ。
環境依存が強すぎる気がする。
0296デフォルトの名無しさん
2011/03/18(金) 17:05:38.55>真理。
足りない言葉がある。
C++って普通の人間なら何でも出来るらしいけど、馬鹿には何にも作れない。。。
0297デフォルトの名無しさん
2011/03/18(金) 17:16:00.110298デフォルトの名無しさん
2011/03/18(金) 23:22:40.63似たような言語ありそうで、ないんだよな
D言語には、代替として凄く期待していたんだけど、いつまでも「乞うご期待」だし
0299デフォルトの名無しさん
2011/03/18(金) 23:33:50.70> 似たような言語ありそうで、ないんだよな
そうそう。
C++は結局逃れられないのだ。
0300デフォルトの名無しさん
2011/03/19(土) 02:09:31.48通信の勉強をして、次に、FTPのRFCをよんで、仕組みを理解したら徐々に作っていく
既存のライブラリで済ませるんなら、そっち方面をあさるのもいい
でも自前で作るのって相応の理由がないと、大抵損だよ。
0301デフォルトの名無しさん
2011/03/19(土) 03:16:03.52const っていうのは、理由があって書き換えられないようにするために付けるものだと思いますが、
こんなキャストがあるおかげで、結局はconstを外せてしまい、constの意味がなくなってしまうのでは。
それにconstを外すなんて、どう考えてもバグの元だと思うのですが。
「constは絶対に外せない」とした方が良くないですか?
0302デフォルトの名無しさん
2011/03/19(土) 03:50:43.82constメンバ関数と非constメンバ関数を一つにまとめる時とか
0303デフォルトの名無しさん
2011/03/19(土) 04:31:18.520304デフォルトの名無しさん
2011/03/19(土) 09:59:15.09基本的には使わないと思っておけばいいよ。
良くあるケースは提供されたライブラリに、引数を変更しないのに const ついてない関数があって
ライブラリ側のソースが直せないけど渡したいケースとか。
理想としては const_cast なくてもいいはずだけど現実的には難しいって感じ。
あるいはライブラリ外部に対しては const として公開しておいて内部では const 外して処理するとか
いう使い方もあるみたい。
0305デフォルトの名無しさん
2011/03/19(土) 10:50:15.06付けるほうは static_cast にしてください。
そんなのが const_cast の検索にひっかかるとウザイ。
0306デフォルトの名無しさん
2011/03/19(土) 13:58:09.43検索に引っかかりすぎてウザイ
0307デフォルトの名無しさん
2011/03/19(土) 15:37:02.28本気? 危険じゃね?
0308デフォルトの名無しさん
2011/03/19(土) 15:56:21.330309デフォルトの名無しさん
2011/03/19(土) 16:00:46.920310デフォルトの名無しさん
2011/03/19(土) 16:29:01.91pc->f();
とするか
const_cast<T const*>(p)->f()
とするかみたいな話では。
常に前者で書くなら const_cast は要らないかもね
0311デフォルトの名無しさん
2011/03/19(土) 16:34:19.94iterator begin() {...}
const_iterator begin() const {
return const_cast<T*>(this)->begin();
}
みたいな時に使う感じ
0312デフォルトの名無しさん
2011/03/19(土) 18:18:23.20constつけるのにも毎度毎度const_cast書いてたの?
0313デフォルトの名無しさん
2011/03/19(土) 18:58:13.10単純にJavaみたいな思想の言語を使えばいいだけなんだよ。
言語ごとにパラダイムが違うんだから適材適所でいいんだよ。
C++もJavaと一緒にされちゃったら存在価値なくなっちゃう。
0314デフォルトの名無しさん
2011/03/19(土) 20:01:02.490315デフォルトの名無しさん
2011/03/19(土) 20:24:19.18と言ってるのかな
論拠はなんなのだろう
0316デフォルトの名無しさん
2011/03/19(土) 20:41:29.25const_cast は危険な操作をそうとわかるように表記するために作られた。
しかし const の付加はそのような危険な操作ではない。
const の付加に const_cast を使うと、 const_cast をキーワードとして
危険な操作を探した場合にノイズとして引っかかる。
安全な操作であるぶん数も多くなり、本来の目的であった危険な操作を
見つけることを難しくしてしまう。
0317デフォルトの名無しさん
2011/03/19(土) 20:50:55.03というならOK
でもそれなら static_cast 関係無くね?
0318デフォルトの名無しさん
2011/03/19(土) 20:59:32.07const を加えただけのポインタや参照に名前を付けたくないとき、 static_cast で済ませることがある。
>>311 とは逆に↓とか。
X const& f() const {...}
X& f() { return const_cast<X&>(static_cast<T const&>(*this)->f()); }
0319デフォルトの名無しさん
2011/03/19(土) 21:22:56.75実際の定義はconstでやる方(>>318)が正解
逆は良くない
なぜならconst_cast<T*>(this)の時点でconstなメンバが変更される余地を残してしまうから
EffectiveC++より
0320デフォルトの名無しさん
2011/03/19(土) 22:02:19.530321デフォルトの名無しさん
2011/03/19(土) 22:03:50.200322デフォルトの名無しさん
2011/03/19(土) 22:20:42.39安全で意味を直接に表現出来る。
static_cast でcv修飾を除くことは出来ないから、その場合 const_cast を使うしかない。
0323デフォルトの名無しさん
2011/03/19(土) 23:03:58.84static_cast より const_cast が安全だ、あるいは逆に static_cast のほうが危険だという理由は何?
意図しない const/volatile の除去が発生する可能性のある const_cast のほうが明らかに危険じゃないか?
0324デフォルトの名無しさん
2011/03/19(土) 23:28:25.820325デフォルトの名無しさん
2011/03/19(土) 23:54:10.630326デフォルトの名無しさん
2011/03/20(日) 00:03:37.97ttp://msdn.microsoft.com/ja-jp/library/cc440192%28VS.71%29.aspx
「static_cast は C++ の道具の中で最も危険なツールの1つであり、ほかのすべての方法でうまくいかないときに限り使うべきである」
とある。あと↓とか
ttp://stackoverflow.com/questions/4954865/any-reason-to-prefer-static-cast-over-a-chain-of-implicit-conversions
うっかりミスをしたら危険なのは static_cast も同じ。
static_cast でcv修飾を誤って除くことは無いということは確かだから
俺がstatic_castでうっかりミスするなんて決してないに決まってるだろクソが
というなら static_cast 使えばいいんじゃね。別に誰も止めんよ
0327デフォルトの名無しさん
2011/03/20(日) 00:13:31.78あと、 stackoverflow のリンク先は const_cast との比較ではないから関係ない。
0328デフォルトの名無しさん
2011/03/20(日) 00:18:06.82http://msdn.microsoft.com/en-us/library/5f6c9f8h.aspx
> Use const_cast and reinterpret_cast as a last resort, since these
> operators present the same dangers as old style casts.
0329デフォルトの名無しさん
2011/03/20(日) 00:31:14.94>static_cast は C++ の道具の中で最も危険なツールの1つであり、
ここ誤植じゃないでしょうか。
reinterpret_castの項目で、static_castの危険性を(より危険なreinterpret_castを引き合いに出して)説明してるのに違和感が・・・
>どちらの形式でも正常に動作するという場合でも、私はやはり reinterpet_cast の使用を推奨します
( ´゚д゚`)エー
0330デフォルトの名無しさん
2011/03/20(日) 00:35:41.73http://www.google.co.jp/search?q=%22static_cast+%E3%81%AF+C%2B%2B+%E3%81%AE%E9%81%93%E5%85%B7%E3%81%AE%E4%B8%AD%E3%81%A7%E6%9C%80%E3%82%82%E5%8D%B1%E9%99%BA%22
もう確認できないが、ログによると英語の原文でも同じだったらしい。
まぁ原文が Google 検索で確認できなくなってる事実からも、
あまりよくない文書だったんだろうと推察できる。
0331デフォルトの名無しさん
2011/03/20(日) 00:54:06.57static_cast と const_cast なら static_cast を使うべき、という主張なのだろうか
目うんこと鼻うんこに感じるんだけど
0332デフォルトの名無しさん
2011/03/20(日) 01:03:45.66if( p )
とやるのと
if( p != NULL )
とやるのはどっちがいいですか?
0333デフォルトの名無しさん
2011/03/20(日) 01:21:29.870334デフォルトの名無しさん
2011/03/20(日) 01:24:25.30せめてC++だったらNULLではなくて0を使おうよー
C++0xならnullptrを
0335デフォルトの名無しさん
2011/03/20(日) 01:28:11.450336デフォルトの名無しさん
2011/03/20(日) 01:34:06.600337デフォルトの名無しさん
2011/03/20(日) 03:07:16.05struct A : B, C {...
void C::f() {
static_cast<A const*>(this)->f(); // 未定義動作
}
間違えば static_cast でも未定義動作なのは同じでしょう。
「俺はそんな間違いをする筈無い」ということなんだろうけど
それは const_cast も同じ。
static_cast も const_cast も危険で注意すべき箇所という事に
違いは無いと思う。
0338デフォルトの名無しさん
2011/03/20(日) 03:29:48.02だいぶ前にもその記事出たんだけど、
記事自体が古い上に、Effective C++のメイヤーや、Exceptional C++のサッターとかから
「何いってんだ、クソが」みたいな投稿があって、フォーラムだかコメントだかで論争になり、
結論として「ごめんよ、ビット列をそのまま解釈するreinterpret_castの方がやっぱキケン」
って次のコラムで論争の内容をまとめた上で謝ってたように思う。
0339デフォルトの名無しさん
2011/03/20(日) 03:32:06.78詳しくはEffective C++に載ってたはず。
0340デフォルトの名無しさん
2011/03/20(日) 03:46:24.870341デフォルトの名無しさん
2011/03/20(日) 03:48:40.48元の意図である「p がヌルじゃなかったら」に近い後者のほうが読みやすい気がする。
でも NULL を使うためにヘッダのインクルードが必要になるのはダルイので、 0 か、
可能なら nullptr を使うのがいい。
0342デフォルトの名無しさん
2011/03/20(日) 03:50:33.080343デフォルトの名無しさん
2011/03/20(日) 04:20:12.52static_cast も const_cast も危険な操作として後から探すと思うんだけど
見つかった static_cast なり const_cast が const を足すだけだった
と分かって紛らわしいということだよね?
static_cast を探した時に見つかるのと const_cast で見つかるのと
そんなに違うのかい?
0344デフォルトの名無しさん
2011/03/20(日) 04:33:23.06暗黙の変換で済むならそれに越した事は無いと思うんだよね。
342のリンク先では、どうしても使うなら static_cast の方が
まだましとあるけど、>>337にあるように、一方のキャストの
危険度が有意に高いということは無いと俺は思ってる。
const を付けるのに {static/const}_cast 使うとかプギャー
というなら完全胴衣なんだが
0345デフォルトの名無しさん
2011/03/20(日) 21:19:12.15たいして違わないけど全く違わないわけでもない。
暗黙変換で済ませるのがベストなのはみんなわかってるだろう。
0346デフォルトの名無しさん
2011/03/20(日) 21:33:03.970347デフォルトの名無しさん
2011/03/20(日) 21:42:46.320348デフォルトの名無しさん
2011/03/20(日) 21:52:08.24ありがとうございます。
仮にスレッドセーフではないと仮定するならば、
複数のスレッドでnewが入る場合は、
newが行われるスレッドが動いている間、
必ずすべてのnewで排他制御が必要になるということですか?
0349デフォルトの名無しさん
2011/03/20(日) 21:54:48.75未規定とはそういうこと
0350デフォルトの名無しさん
2011/03/20(日) 22:19:52.94なるほど・・・
すべてのnewで排他制御の他にスレッドセーフへのアプローチ方法はありますか?
0351デフォルトの名無しさん
2011/03/20(日) 22:50:23.330352デフォルトの名無しさん
2011/03/20(日) 22:51:11.950353デフォルトの名無しさん
2011/03/20(日) 22:55:43.25>>351
やはりそのあたりが現実的でしょうか
>>352
仮にoperator new をしてもすべてのnewをのっとれるわけではないですよね?
0354デフォルトの名無しさん
2011/03/20(日) 22:58:52.67GCCはよく知らん
0355デフォルトの名無しさん
2011/03/20(日) 23:03:11.23スレッドが動く環境のコンパイラなら new なり malloc なりの下位層で対応済みなことがあるから、
まずは環境についてのドキュメントを確認したほうがいいんじゃないか?
0356デフォルトの名無しさん
2011/03/20(日) 23:08:07.30そうですね、ありがとうございます。
0357デフォルトの名無しさん
2011/03/21(月) 22:01:14.81"ab100cd33e"
=>
a
b
100
c
d
33
e
という感じに、数字はまとめて配列か、tupleに入れてくれるようなライブラリはないでしょうか。
また、近い使い方が出来るものも無いでしょうか?
現状、istringstreamのget()メソッドで一文字ずつ取り出して自力で解析するコードが見難くて困っています。
0358デフォルトの名無しさん
2011/03/21(月) 23:47:35.32#include <iostream>
#include <boost/xpressive/xpressive.hpp>
int main()
{
using boost::xpressive::digit;
using boost::xpressive::alpha;
std::string input("ab100cd33e");
boost::xpressive::sregex token = +digit | alpha;
boost::xpressive::sregex_token_iterator begin(input.begin(), input.end(), token);
boost::xpressive::sregex_token_iterator end;
std::vector<std::string> array(begin, end);
std::ostream_iterator<std::string> output(std::cout, "\n");
std::copy(array.begin(), array.end(), output);
}
こんなんでどうよ
0359デフォルトの名無しさん
2011/03/21(月) 23:55:01.12#include <string>
#include <vector>
#include <iterator>
を足しといて
0360デフォルトの名無しさん
2011/03/21(月) 23:56:35.650361357
2011/03/22(火) 00:40:24.42カッコ良過ぎる・・・
ありがとうございます。
こういうC++的な書き方は非常に参考になります。
>>360
boost::tokenizerで出来ないか丁度検討してました。
可能だと分かり、助かります。ありがとうございます。
0362デフォルトの名無しさん
2011/03/25(金) 20:26:20.32int i;
class B {
B(){
//ここでA::iにアクセスする方法ありますか?
};
}
A(){
B b;
};
};
上にような構造のクラス作る時、外側のクラスの変数に簡素にアクセスする方法があれば教えてください
やはりBのコンストラクタあたりでiを渡さないといけませんか?
わかりにくかったらすいません
0363デフォルトの名無しさん
2011/03/25(金) 21:58:57.090364デフォルトの名無しさん
2011/03/25(金) 22:54:32.58A::A(){
B b(this);
}
のように渡さないといけないということでしょうか
言語的に外側のクラスから引っ張ってくるようなことはできないのでしょうか
0365デフォルトの名無しさん
2011/03/25(金) 22:59:17.96少しは自分の脳みそで考えてみろ。
A::B というクラスは A とは独立して存在するんだが、どの A オブジェクトの i をアクセスするというんだ。
0366デフォルトの名無しさん
2011/03/25(金) 23:29:29.610367デフォルトの名無しさん
2011/03/25(金) 23:29:33.990368デフォルトの名無しさん
2011/03/25(金) 23:30:29.22何かアクセスする方法ができるのだと思っていました
0369デフォルトの名無しさん
2011/03/25(金) 23:32:05.590370デフォルトの名無しさん
2011/03/25(金) 23:34:06.07cout << setw(4) << setfill('0');
cout << 0 << endl;
cout << 0 << endl;
とかくと"0000", "0" となります。
1回の設定で全部のcoutに桁指定0詰めをさせる方法はありませんか?
cout << setw(4) << setfill('0') << 0 << endl;
cout << setw(4) << setfill('0') << 0 << endl;
と書くとオーバーヘッドがありそうで…。
0371デフォルトの名無しさん
2011/03/26(土) 01:00:20.98素人め!そんな軟弱なCPU使ってるのかよ。と突っかかってみる。
まー、それくらいのオーバーヘッドはたいしたこと無い。
それより、その設定を残してプロジェクトで混乱起こすよりましじゃね?
0372デフォルトの名無しさん
2011/03/26(土) 01:25:23.91std::printfを使えばよい。cout使う奴はあほ
0373デフォルトの名無しさん
2011/03/26(土) 01:42:44.57フラグでORを取っておいてsetfを使うといいのでは?
全部のcoutという表現は正しくない
一度出力を終えるとリセットされてしまうフラグとそうでないフラグがあるだけの話
0374デフォルトの名無しさん
2011/03/26(土) 02:26:36.71ヒープに作ったオブジェクトをvectorに入れていくので
前者の方が手間がかからないと思うのですが
後者のメリットは何ですか。
0375デフォルトの名無しさん
2011/03/26(土) 02:53:08.930376デフォルトの名無しさん
2011/03/26(土) 02:55:34.29意味がわからない。
C++ でおk
0377デフォルトの名無しさん
2011/03/26(土) 02:58:40.110378デフォルトの名無しさん
2011/03/26(土) 03:05:35.83スタックに確保するアロケーターのvectorと
フリーストアに確保するアロケーターのvectorの比較だろ。
前者はすぐにメモリが解放されるので使い物にならない。
0379デフォルトの名無しさん
2011/03/26(土) 03:13:16.39vec.push_back(s);
string*p = new stirng("hoge");
vec.push_back(p);
>>374がvectorにアロケータが渡せるなんて知らないだろうからこっちの意味だろう。
0380デフォルトの名無しさん
2011/03/26(土) 03:18:30.17そういう事です^q^
0381デフォルトの名無しさん
2011/03/26(土) 03:21:54.160382デフォルトの名無しさん
2011/03/26(土) 03:22:11.86後者がポインタの vector なら、コピーできない(コピーのコストが高すぎる)オブジェクトにも対応できる。
そうでもなければ使う必要が無い。
0383デフォルトの名無しさん
2011/03/26(土) 03:29:36.91わかりました!!
ありがとうございます"!!
0384デフォルトの名無しさん
2011/03/26(土) 10:12:02.04アドバイスありがとうございます!
0385デフォルトの名無しさん
2011/03/27(日) 03:30:42.33boost::tokenizer で数字の連結なんて出来るんですか?
boost::tokenizer で数字以外の全ての文字を区切り文字に指定する方法しか思いつかないですが、
そんな方法が最善とは思えません。どうするんでしょうか?
0386デフォルトの名無しさん
2011/03/28(月) 13:23:16.230387デフォルトの名無しさん
2011/03/30(水) 14:45:41.260388デフォルトの名無しさん
2011/03/30(水) 15:01:31.12ttp://d.hatena.ne.jp/faith_and_brave/20100114/1263440472
0389デフォルトの名無しさん
2011/03/30(水) 15:02:22.05template <int N, int M = 0>
struct hoge {
static const int keta = hoge<N/10, M + 1>::keta;
};
template <int M>
struct hoge<0, M> {
static const int keta = M;
};
int main() {
std::cout << hoge<111>::keta << std::endl;
}
自信ないけど
0390デフォルトの名無しさん
2011/03/30(水) 15:04:55.220391デフォルトの名無しさん
2011/03/31(木) 03:08:45.57template<int N> struct keta { static int const value = keta<N / 10>::value + 1; };
template<> struct keta<0> { static int const value = 1; };
template<> struct keta<1> : keta<0> {};
template<> struct keta<2> : keta<0> {};
template<> struct keta<3> : keta<0> {};
template<> struct keta<4> : keta<0> {};
template<> struct keta<5> : keta<0> {};
template<> struct keta<6> : keta<0> {};
template<> struct keta<7> : keta<0> {};
template<> struct keta<8> : keta<0> {};
template<> struct keta<9> : keta<0> {};
#include "boost/static_assert.hpp"
BOOST_STATIC_ASSERT(keta<0>::value == 1);
BOOST_STATIC_ASSERT(keta<9>::value == 1);
BOOST_STATIC_ASSERT(keta<10>::value == 2);
BOOST_STATIC_ASSERT(keta<99>::value == 2);
BOOST_STATIC_ASSERT(keta<1000>::value == 4);
BOOST_STATIC_ASSERT(keta<9999>::value == 4);
BOOST_STATIC_ASSERT(keta<10000000>::value == 8);
BOOST_STATIC_ASSERT(keta<99999999>::value == 8);
0392デフォルトの名無しさん
2011/03/31(木) 03:10:50.34BOOST_STATIC_ASSERT(hoge<0>::keta == 1);
:12: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
0393デフォルトの名無しさん
2011/03/31(木) 03:19:40.57#include "boost/mpl/if.hpp"
#include "boost/mpl/int.hpp"
template<int N> struct keta : boost::mpl::int_<1 + boost::mpl::if_c<(N < 10), boost::mpl::int_<0>, keta<N / 10> >::type::value > {};
0394デフォルトの名無しさん
2011/03/31(木) 08:39:18.08木構造でshared_ptrを使おうと思っていたのですが、親へのポインタを持つと循環参照の問題が出てきます
回避策として親へのポインタを生ポで持たせようと思ったのですが、それではshared_ptr使う意味がない
そこでunique_ptrで寿命を管理し、生ポで参照させようとしたのですが、どうも不格好な気がします
生ポを出すと知らぬ間にdeleteされるかもしれない、でもそれはshared_ptrでもできないわけではない
こういう場合、コストを払ってでも、所有者が複数いることを明示するためにshared_ptrを使うべきでしょうか?
0395デフォルトの名無しさん
2011/03/31(木) 08:49:04.350396デフォルトの名無しさん
2011/03/31(木) 09:28:12.060397デフォルトの名無しさん
2011/03/31(木) 10:15:53.25ただ循環参照の問題はきっかけではありますが本質ではなく、
端的に言うと、スマートポインタ使用時に生ポを出すのはありなのかという疑問です
>>395が一番スマートなのでしょうか
なぜか全く思いつきませんでした
shared_ptr<int> obj1::get() {
return ptr; // shared_ptrオブジェクトを返す コスト大
} // 一時的に使用するために呼び出す場合でもshared_ptrで返すべきなのだろうか(一時的に所有すると考えるべき?)
const int * obj2::get() {
return ptr.get(); // 生ポを返す
} // 生ポを出すのは不格好な気がする
const int * obj3::get() { // unique_ptr<int> ptr;
return ptr.get(); // 生ポをむき出しにするのであれば、unique_ptrでいいのでは
} // もちろんshared_ptrでなければいけないケースもあるだろうけど
0398デフォルトの名無しさん
2011/03/31(木) 11:21:18.35基本的にはナシだけど使うときは使うかな
でもCとの連絡とモニカとしての利用以外で使うことはないな
>>397の例だと
- shared_ptr<int>を返す
- const shared_ptr<int> &を返す
- (目的にあうなら)intを返す
のどれかがいいんじゃないかな
木については
- 子→親が必要ない場合は親→子だけをunique_ptrで管理
- いるならshared_ptrとweak_ptrで管理
- 平衡くさい2分木ならvector<T>(かvector<unique_ptr<T>>)で添字管理するのが楽なこともある(根は1で、左 = 親 * 2、右 = 親 * 2 + 1)
- 子が親の(C++の)参照を持つとノード削除したとき困ると思う
みたいな感じ
0399デフォルトの名無しさん
2011/03/31(木) 11:41:48.48Googleスタイルだと禁止されてるんですけど
0400デフォルトの名無しさん
2011/03/31(木) 11:45:09.30チームの意向があるならそれに従えばよろし
0401デフォルトの名無しさん
2011/03/31(木) 12:07:28.06使わない
使う上で注意しなきゃならないこともある割りにはメリットが少ないし
C#みたいに引数指定で関数呼び出せるなら便利に使えるんだろうけどね…
0402デフォルトの名無しさん
2011/03/31(木) 12:54:35.080403デフォルトの名無しさん
2011/03/31(木) 14:34:31.18バイナリデータをファイルから読み込んで、メモリー上に格納する時、今までは
std::vector<byte>
を使っていました。
ただ、よく考えたら
std::vector<byte> buffer(size);
fread(fp, 1, size, &buffer[0]);
とやると、bufferの初期化時に全て0初期化されますよね。
普段は気にならないのですが、大きなデータを読み込む時にはもったいない気がします。
この初期化を行わない、バイナリデータを格納するのにふさわしい代替品は無いでしょうか?
0404デフォルトの名無しさん
2011/03/31(木) 14:52:32.83それより初期化よりもロードが圧倒的にかかる。
細かいこと気にするな。
0405デフォルトの名無しさん
2011/03/31(木) 15:03:07.070406デフォルトの名無しさん
2011/03/31(木) 16:17:25.520407デフォルトの名無しさん
2011/03/31(木) 16:18:34.52stringに、'\0'が入りうるバイナリ列を入れて良いものなのでしょうか?
newですと、解放責任の問題が厄介です。
shared_arrayが最も要件を満たすようですが、スレッドセーフなど機能が大きすぎる気がします。
それっぽいstd::arrayについて調べてみましたが、こちらは新たに型を作るもののようで、型を作りたいわけではないのでミスマッチでした。
0408デフォルトの名無しさん
2011/03/31(木) 16:20:47.63wstringは、wchar_tの配列。
ばいなり格納可。
0409デフォルトの名無しさん
2011/03/31(木) 16:22:06.08何度も生成するなら、消さずに使い回せ。
初期化に時間食うほど確保したら、ロードはものすごくかかるだろ。
0410デフォルトの名無しさん
2011/03/31(木) 16:24:02.20初期化が時間食うのは、他に何もしていないプログラムか、無駄なことをしているプログラム。
0411デフォルトの名無しさん
2011/03/31(木) 16:28:02.41unixはしらんがたとえばwinapiを直に呼べばロスは減る。
0412デフォルトの名無しさん
2011/03/31(木) 16:48:18.07boostのscoped_arrayか0xのunique_ptr
0413デフォルトの名無しさん
2011/03/31(木) 17:25:24.54お前、レスはまとめて書けよ
あと口汚い
0414デフォルトの名無しさん
2011/03/31(木) 17:39:00.65deque(変数名Aとします)を利用して以下の条件を満たせる配列を作りたいのです
・クラスのメンバー変数である
・A[0]~A[9]を作れる
・Aはint[2]を持つ
・Aにはいくつpushされるかわからない
・A[x]に対してpushを行うと、int[2]が追加される
・A[x]の中のint[2]の各要素に代入ができる
こんな感じです
A[0]={ [0,0,0] }→A[0].push_frontする→A[0]={ [1,1,1],[0,0,0] }
→A[0].at?~[0] [0] = 2 →A[0]= { [2,1,1],[0,0,0] }
deque<int[2]>やdeque<deque<int>>では上手くpushする方法がわからず作成できないのです
もし「こうすれば上手くできる」、というのがありましたらそれでもかまいません
0415デフォルトの名無しさん
2011/03/31(木) 17:50:18.39なんでかっていうと、pushできるから
0416デフォルトの名無しさん
2011/03/31(木) 17:55:46.22deque<deque<int> > か、deque<boost::array<int, 3> > でできると思うよ
0417デフォルトの名無しさん
2011/03/31(木) 18:00:59.400418デフォルトの名無しさん
2011/03/31(木) 18:03:33.80a.push_front(make_tuple(1,2,3));
0419デフォルトの名無しさん
2011/03/31(木) 18:06:45.69deque<int>にした場合 A[0].push_back()の時に渡す値がわからないのです。
A[0].push_back({0,0,0})とかint x[2]={0,0}A[0].push_back(x)だとエラーが出てしまって
>>416
なんかdequeが便利そうで・・・初心者なもので特に深い理由は
>>417
その発想はありませんでした
0420デフォルトの名無しさん
2011/03/31(木) 18:14:44.36調べてみたらboostみたいですね。ちょっと試してみます
0421デフォルトの名無しさん
2011/03/31(木) 18:28:56.35A[0].push_back(x)がエラーになるって書いてるけど、ほんとに?
再現コードを書いてくれないのも初心者だからですか?
deque<deque<int> > A;
A.push_back(deque<int>());
A[0].push_back(3);
これはエラーになりますか?
0422デフォルトの名無しさん
2011/03/31(木) 18:49:06.66コンパイルされたクラスの テンプレート のインスタンス化 'std::deque<_Ty>' の参照を確認してください
みたいなエラーが出ます
再現コードはこんな感じですね
Class Class
{
deque<int[2]> A[9]
};
void F(Class &Class){
int x[2]={0,0};
Class.A[0].push_back(x);
}
deque<deque<int> > A;
A.push_back(deque<int>());
A[0].push_back(3);
は上手くいきました
0423デフォルトの名無しさん
2011/03/31(木) 18:56:59.57deque<int[2]>は無理だよ。
0424デフォルトの名無しさん
2011/03/31(木) 19:11:55.78そうみたいですね
皆さんのおかげでうまくいきました。ありがとうございました!
0425デフォルトの名無しさん
2011/04/01(金) 12:07:52.91{
virtual ~Parent(void){}
};
class Child : public Parent
{
void ~Child(void){}
};
class Grandchild : public Child
{
void ~Grandchild(void){}
};
Parent *p1 = new Grandchild;
Child *p2 = new Grandchild;
上記のような構成の時、Childクラスのデストラクタにもvirtualを付けた方がいいのでしょうか?
C++の解説サイトを回ると付けている方が多いのですが、付けずにp1やp2のように使った場合でも問題なくデストラクタが呼ばれたので、どうするべきか悩んでいます。
virtualを付けること、付けないことによる不利益などありましたら、教えていただけるとありがたいです。
なお、コンパイラはVisual Studio 2008を使用しています。
0426デフォルトの名無しさん
2011/04/01(金) 12:45:14.580427デフォルトの名無しさん
2011/04/01(金) 12:45:26.13親がvirtualなら子も自動的にvirtualになるから付けても付けなくても一緒
付ければ見た目にわかりやすいかもしれないが、いちいち冗長で、省略できるものは省略すればいいじゃんと思う人もいる
0428デフォルトの名無しさん
2011/04/01(金) 12:55:55.98自分で理解して使う分にはいいと思うけど
仮想デストラクタでない=継承しないで欲しいの意で使う人がいるから
留意しておくといいかもしれない
0429デフォルトの名無しさん
2011/04/01(金) 13:26:38.910430デフォルトの名無しさん
2011/04/01(金) 14:50:58.71f(++n, ++n, ++n)とf( n++,n++,n++)
をやってみたらaから順に前者は3 3 3
後者は2 1 0だったようなあいまいな記憶があります。
なぜこうなるのか教えてください。
0431デフォルトの名無しさん
2011/04/01(金) 14:54:23.50未定義動作です。そうなるとは限りません。
http://www.kouno.jp/home/c_faq/c3.html#9
0432デフォルトの名無しさん
2011/04/01(金) 18:41:20.090433デフォルトの名無しさん
2011/04/01(金) 19:01:06.63禿のFAQはれよ
0434デフォルトの名無しさん
2011/04/01(金) 19:20:01.45ISO 14882はれよ
>i = v[i++]; // the behavior is unspecified
0435デフォルトの名無しさん
2011/04/01(金) 19:25:35.910436デフォルトの名無しさん
2011/04/01(金) 19:27:28.320437デフォルトの名無しさん
2011/04/01(金) 19:31:39.50ただのバカ
0438デフォルトの名無しさん
2011/04/01(金) 19:34:25.200439デフォルトの名無しさん
2011/04/01(金) 19:39:54.29保証されてるとか勘違いしだすバカ
0440デフォルトの名無しさん
2011/04/01(金) 19:53:13.57対偶も分からずにプログラミングしてて大丈夫か?
0441デフォルトの名無しさん
2011/04/01(金) 20:13:11.86Parent a;
Parent b = a;
などとするとC++0xではdeprecatedになりますが
現行のC++では問題ないのでコンパイラは警告してくれません
既存コード中にこのようなものがあるかを簡単に調べるにはどうすればいいですか?
0442デフォルトの名無しさん
2011/04/01(金) 20:17:41.260443デフォルトの名無しさん
2011/04/01(金) 20:30:28.680444デフォルトの名無しさん
2011/04/01(金) 20:42:08.850445デフォルトの名無しさん
2011/04/01(金) 20:43:25.36なんで?
0446デフォルトの名無しさん
2011/04/01(金) 20:49:49.980447デフォルトの名無しさん
2011/04/01(金) 20:55:18.240448デフォルトの名無しさん
2011/04/01(金) 20:57:33.56大丈夫だ。問題ない。
0449デフォルトの名無しさん
2011/04/01(金) 21:00:14.840450デフォルトの名無しさん
2011/04/01(金) 21:23:11.48http://cpplover.blogspot.com/2010/11/c0x.html
0451デフォルトの名無しさん
2011/04/01(金) 21:32:34.69これは気持ち悪いな
0452デフォルトの名無しさん
2011/04/01(金) 21:36:55.610xって、キモいな。
間違った進化を遂げているようにしか見えん。
0453デフォルトの名無しさん
2011/04/01(金) 21:38:00.25高速化のため仕方がないとは言え
0454デフォルトの名無しさん
2011/04/01(金) 21:44:33.720455デフォルトの名無しさん
2011/04/01(金) 21:45:30.140456デフォルトの名無しさん
2011/04/01(金) 21:49:45.490457デフォルトの名無しさん
2011/04/01(金) 21:58:07.120458デフォルトの名無しさん
2011/04/01(金) 22:27:53.530459デフォルトの名無しさん
2011/04/01(金) 23:03:46.51ガベコレ無しのJavaやC#みたいな感じで。
0460デフォルトの名無しさん
2011/04/01(金) 23:15:02.630461デフォルトの名無しさん
2011/04/01(金) 23:16:18.040462デフォルトの名無しさん
2011/04/01(金) 23:17:47.42その流れで、これまでいくつもの離反組が巣立っていったが
禿以上の台風の目になれた人はいまだにいないね
0463デフォルトの名無しさん
2011/04/01(金) 23:18:34.140464デフォルトの名無しさん
2011/04/01(金) 23:22:14.74別にCとしてコンパイルするわけでもあるまい
0465デフォルトの名無しさん
2011/04/01(金) 23:30:14.560466デフォルトの名無しさん
2011/04/02(土) 00:08:08.57で、文字列を返す関数がたくさんあるんですけど戻り値の型で悩んでるんです。
必ず存在するのであれば無問題。
const wstring& getValue() const { return value; }
存在するか分からない場合はどうするのがよいでしょうか?
1.参照で返す。
const wstring& getAttribute(...) const { if(...) return value; else throw exception(); }
2.無理矢理参照で返す。
const wstring& getAttribute(...) const { return ... ? value : L""; }
3.stringのポインタで返す。
wstring* getAttribute(...) const { return ... ? value : nullptr; }
4.ポインタで返す。
wchar_t* getAttribute(...) const { return ... ? value.c_str() : nullptr; }
0467デフォルトの名無しさん
2011/04/02(土) 00:17:22.700468デフォルトの名無しさん
2011/04/02(土) 00:51:27.020469デフォルトの名無しさん
2011/04/02(土) 00:57:11.77boost::optional<wstring&>
っていうか参照返して大丈夫?
値で返さないと危ないし実装も制限されちゃうよ?
0470デフォルトの名無しさん
2011/04/02(土) 01:00:42.78| getValue
0471デフォルトの名無しさん
2011/04/02(土) 01:21:24.730472デフォルトの名無しさん
2011/04/02(土) 01:38:55.15c++erなら小文字にハイフンだろ
0473デフォルトの名無しさん
2011/04/02(土) 10:19:11.75おっしゃるとおりなのですが、return L""をやっていいものか少し不安です
>>469
メンバ変数を参照で返してはいけないみたいなことは最近よく聞く気がします
寿命による危険性は分かるのですが、ほかの理由はなんなのでしょうか?
0474デフォルトの名無しさん
2011/04/02(土) 10:28:53.78return emptywsring;
0475デフォルトの名無しさん
2011/04/02(土) 11:16:57.000476デフォルトの名無しさん
2011/04/02(土) 12:04:44.41getValue…Haskell中
GetValue…Pascal中
get_value…C++中
異論は認める
0477デフォルトの名無しさん
2011/04/02(土) 12:06:04.080478デフォルトの名無しさん
2011/04/02(土) 12:07:50.67ハイブリッド
0479デフォルトの名無しさん
2011/04/02(土) 12:11:28.830480デフォルトの名無しさん
2011/04/02(土) 12:12:56.040481デフォルトの名無しさん
2011/04/02(土) 12:22:33.900482デフォルトの名無しさん
2011/04/02(土) 12:48:37.06ただWin32APIはパスカルなんだよなw
0483デフォルトの名無しさん
2011/04/02(土) 13:02:16.980484デフォルトの名無しさん
2011/04/02(土) 13:13:52.93C+WINAPIの凶悪さ
0485デフォルトの名無しさん
2011/04/02(土) 13:55:51.750486デフォルトの名無しさん
2011/04/02(土) 14:34:30.34その中ならば、1.の参照or例外がいいんじゃないか? 2は危険で警告出るし、3,4はnullptrの扱いが面倒だしバグを誘発しやすいし
例外がいやならboost::optionalで返す。
boost::optional<wstring> getAttribute(...) const { if(...) return value; else boost::none; }
こんな風に呼ぶ
if(auto x=a.getAttribute(....))
func(*x); //存在したときのみfuncする。
0487デフォルトの名無しさん
2011/04/02(土) 16:02:42.91> 寿命による危険性は分かるのですが、ほかの理由はなんなのでしょうか?
469 にあるとおり、実装が制限されてしまうことが問題。
たとえば返したい文字列が既存のメンバ変数 a と b を繋げた a + b だとしても、
return a + b とはできず、 a + b を保持する ab のようなメンバ変数が必要になる、
など。
0488デフォルトの名無しさん
2011/04/02(土) 17:24:33.740489デフォルトの名無しさん
2011/04/02(土) 18:40:38.12例えば、
void Hoge();
if(IsExitHoge())
{
Hoge();
}
のような
0490デフォルトの名無しさん
2011/04/02(土) 18:56:14.72無ければリンク時にエラーになるから、そんな方法は不要であり存在しない。
0491デフォルトの名無しさん
2011/04/02(土) 19:03:06.54まず発覚するのがリンカーなので無理ですよね
ありがとうございました
0492デフォルトの名無しさん
2011/04/02(土) 20:02:13.01挿入する要素は100程度です
0493デフォルトの名無しさん
2011/04/02(土) 20:18:21.760494デフォルトの名無しさん
2011/04/02(土) 20:18:43.01要素数100だったらmap/setの方が早いかもね
0495デフォルトの名無しさん
2011/04/02(土) 21:49:16.89>>494
setの存在を完璧に忘れてました・・・
ありがとうございます
0496デフォルトの名無しさん
2011/04/03(日) 16:33:16.16//file1.cpp
namespace { struct A{}; };
// file2.cpp
#include "file1.cpp
namespace { struct A{}; };
// ビルド VC++2010EE
error C2011: '`anonymous-namespace'::A' : 'struct' 型の再定義
でも、名前空間をBとCに分けると、当然ながらOKに。なんか納得出来ないんだけど。
0497デフォルトの名無しさん
2011/04/03(日) 16:44:04.07.cpp をインクルードするな。
無名名前空間はコンパイル単位ごとにユニークなもの。ファイルごとじゃない。
0498デフォルトの名無しさん
2011/04/03(日) 16:45:15.19そういう仕様です。
0499デフォルトの名無しさん
2011/04/03(日) 16:56:29.29そうだと思ってたけど、本当は翻訳単位なのね。
勉強になりました、どうもセックスコ
0500デフォルトの名無しさん
2011/04/03(日) 18:13:55.860501デフォルトの名無しさん
2011/04/03(日) 20:14:38.67includeしたヘッダに無名名前空間しか無いとでも?
想像力が乏しい人だな
0502デフォルトの名無しさん
2011/04/03(日) 23:12:59.31君はプログラミングに向いてない
0503デフォルトの名無しさん
2011/04/04(月) 00:29:57.390504デフォルトの名無しさん
2011/04/04(月) 00:57:34.29間違った説明を読んで ↓ ができると思ったんだろ。
file1.cpp: namespace {int x;} int &f1(){return x;}
file2.cpp: #include "file1.cpp" namespace {int x;} int &f2(){return x;}
残念ながらC++は未だにCのプリプロセッサの糞仕様を引きずった言語
0505デフォルトの名無しさん
2011/04/04(月) 02:57:43.83無名の名前空間ってなんのためにあるんですか?
0506デフォルトの名無しさん
2011/04/04(月) 03:02:43.62匿名名前空間なんだから個々は干渉し合わないと考えるのが普通なわけだがw
0507デフォルトの名無しさん
2011/04/04(月) 03:34:37.75static だと内部結合だけど無名名前空間だと外部結合になるよ
0508デフォルトの名無しさん
2011/04/04(月) 07:29:04.26内部リンケージと、絶対他から参照されない外部リンケージの
何が機能的に違うのかを説明してくれたまへ
0509デフォルトの名無しさん
2011/04/04(月) 08:14:27.980510デフォルトの名無しさん
2011/04/04(月) 08:44:43.47素直に無名名前空間使え!
と規格には書いてある
理由はいろいろあるけど気にするな
0511デフォルトの名無しさん
2011/04/04(月) 11:13:31.050512デフォルトの名無しさん
2011/04/04(月) 11:59:18.96{}
の&ってどういう意味ですか?
0513デフォルトの名無しさん
2011/04/04(月) 12:03:48.680514デフォルトの名無しさん
2011/04/04(月) 12:17:27.71char[8] の参照。
0515デフォルトの名無しさん
2011/04/04(月) 12:19:30.06{}
とどう意味が違うんですか?
0516デフォルトの名無しさん
2011/04/04(月) 12:19:53.110517デフォルトの名無しさん
2011/04/04(月) 12:26:25.400518デフォルトの名無しさん
2011/04/04(月) 12:32:34.84ポインタと参照の利点欠点の話じゃね?
個人的には参照で任意の長さの配列を取るテンプレート関数書けるから色々重宝してるな。
template<class T,int N>
void DoSomething(T (&Ary)[N]){
//DODODO
}
ちょっと踏み込めば行列演算もかけるよ。効率は書き方しだいだけど。
0519デフォルトの名無しさん
2011/04/04(月) 12:35:27.90ふつうだけじゃ色々不都合があるんだよ。
>>515
引き数限定で、
char a // char
char & a // charの参照(通常使わない)
char * a // charへのポインタ
char a[8] // char *aと解釈される
char (& a)[8] // char[8]の参照
char (* a)[8] // char[8]へのポインタ
となる。
0520デフォルトの名無しさん
2011/04/04(月) 12:58:54.30引数限定なのは↓だけでしょ。
> char a[8] // char *aと解釈される
0521デフォルトの名無しさん
2011/04/04(月) 13:04:08.06PHPの関数をCに移植してLIBを作りたいのですが。
どうやるといいですか?
PHPがバージョンアップしても移植部分のコードは変更なしがいいのですが。
PHPソースコードのある所
http://www.php.net/downloads.php
0522デフォルトの名無しさん
2011/04/04(月) 13:06:36.830523デフォルトの名無しさん
2011/04/04(月) 13:38:06.69コードが公開されてるなら、それを移植。
コードが公開されて無いなら、想像して実装。
スクリプト上での便利機能を移植したいなら、結局関連する機能全部移植。
Cの上でやる以上、Cの文法からは逃げられないし、PHPライクにしたいならプリプロセッサ地獄におちるだろう。
0524デフォルトの名無しさん
2011/04/04(月) 16:18:11.35sizeof a
0525デフォルトの名無しさん
2011/04/04(月) 19:32:23.84includeしたヘッダの無名名前空間のみが見えなくなると思ったのか。おめでたいな。
0526デフォルトの名無しさん
2011/04/04(月) 19:37:40.03int とか charとかもしてる?
それとも、集成型以上に限定してる?
0527デフォルトの名無しさん
2011/04/04(月) 19:49:42.680528526
2011/04/04(月) 20:05:41.170529デフォルトの名無しさん
2011/04/04(月) 20:16:50.240530デフォルトの名無しさん
2011/04/04(月) 20:25:34.200531デフォルトの名無しさん
2011/04/04(月) 20:32:59.58かなー。
0532デフォルトの名無しさん
2011/04/04(月) 20:33:55.590533デフォルトの名無しさん
2011/04/04(月) 20:50:50.850534デフォルトの名無しさん
2011/04/04(月) 20:53:09.800535デフォルトの名無しさん
2011/04/04(月) 21:06:43.80ふっふっふ、そこには抜け穴があって"位"って書いてあるじゃん。
別に8バイトでもいb「のよ。概ねsizeof(int)位ってことで・・・。
0536デフォルトの名無しさん
2011/04/04(月) 21:09:33.81C/C++で「無線LANスポット」を一覧取得出来るようなネットワークプログラミング向けのライブラリ等ありませんでしょうか。
0537デフォルトの名無しさん
2011/04/04(月) 21:12:47.78アホか
アドレスのサイズはsizeof(void*)
0538デフォルトの名無しさん
2011/04/04(月) 21:13:29.30OS依存
スレ違い
0539526
2011/04/04(月) 21:15:49.19たまに統一感があるからという理由でinはどの型でもconst参照、outはポインタにって現場があるので聞いてみました。
0540デフォルトの名無しさん
2011/04/04(月) 21:16:00.63C/C++で「Gスポット」の場所を取得出来るようなライブラリ等ありませんでしょうか。
0542デフォルトの名無しさん
2011/04/04(月) 21:33:45.52いや、OSの仕事でもないよそれ・・・。
0543デフォルトの名無しさん
2011/04/04(月) 22:13:48.56今DXライブラリの通信を利用してクラスを送り、受信側の同じクラスにコピーして、メンバーを表示するというプログラムを書いているのです。
現在コピーするクラスは
int a[9]が5つ std::string a[9][30]が1つ クラスのメンバーを持っています
これを以下のように受け取っているのですが
Class Class_copy
Class *test;
test=new Class;
NetWorkRecv( NetHandle , Chara_test , DataLength ) ; // データをバッファに取得
Class_copy=*test;
これを実行したときにstd::string a[9]が8文字以上のひらがな・漢字・全角カナを受け取ると表示したときに凄く文字化けしてしまうのです
他のint型メンバーや7文字以下のstringは何も問題がないのですが・・・
一体何が原因なのでしょうか
0544デフォルトの名無しさん
2011/04/04(月) 22:30:12.670545デフォルトの名無しさん
2011/04/04(月) 22:34:58.750546デフォルトの名無しさん
2011/04/04(月) 22:36:52.540547デフォルトの名無しさん
2011/04/04(月) 22:41:28.09std::stringをビットごとにコピーしても動かないぞ
0548536
2011/04/04(月) 22:48:22.74あ、そうなんですか・・・?
WDKというデバイス開発用キットを落として入れてみたりはしたんですが、
ネットワークプログラミング自体に接するのが初めてでして、そういったライブラリが既にどこかに存在するのかと推察しておりました。
よろしければご教授頂けませんか?
0549デフォルトの名無しさん
2011/04/04(月) 22:50:36.78ちょっと書き方が悪かったです。string[9][30]のstring[1][30]~[9][30]に受け取った文字です
動作としてはこんな感じです
a[0][30]="ああああ" 普通に表示
a[1][30]="ああああああああ" 表示すると文字化け
>>547
NetWorkRecv(int NetHandle, void *Buffer, int Length)は NetHandle の指し示す接続先からDataLength分データをバイト単位でBufferの示すアドレスにコピーする、とのことです
std::stringはビットごとにコピーしても動かないのですか?7文字以下だとちゃんと表示されるのですが・・・
0550デフォルトの名無しさん
2011/04/04(月) 22:51:07.790551デフォルトの名無しさん
2011/04/04(月) 22:57:25.09そのまま突っ込むのはさすがに無理がありすぎるだろ
0552デフォルトの名無しさん
2011/04/04(月) 22:57:46.140553デフォルトの名無しさん
2011/04/04(月) 23:07:01.54便利なcharぐらいの印象です。
>>551
シリアライズですか。ちょっと調べてみよう・・・
0554デフォルトの名無しさん
2011/04/04(月) 23:11:08.30charは文字で、stringは文字列だぞ
言わば、string == char[]
0555デフォルトの名無しさん
2011/04/04(月) 23:12:37.99いくらなんでもそこは等号じゃないだろう。
0556デフォルトの名無しさん
2011/04/04(月) 23:13:02.43せっかくだから Plain Old Data についても調べておくといいかもしれない
0557デフォルトの名無しさん
2011/04/04(月) 23:16:30.440558デフォルトの名無しさん
2011/04/04(月) 23:16:47.28≒とか付けるの面倒だったんだ察してくれw
0559デフォルトの名無しさん
2011/04/04(月) 23:34:08.45よく考えればそうかも。改宗します。
0560デフォルトの名無しさん
2011/04/04(月) 23:58:24.67そのまま送ってデータが届くわけがないだろう。
どんなテレパシーなんだよ。
0561デフォルトの名無しさん
2011/04/05(火) 02:02:52.140562のみねーと ◆myadMFZ/7k
2011/04/05(火) 08:25:45.87_/△ハ,,__ / ハ !:.:.:.:.:.:.::.:.:.:.:.:.:... :.:.:.:.ヘ
/: : : : : :/ ||:.:i/'ーリ―- 、_:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:. :.:.:.:.:.:.ハ
//: : /: :.:.ト=': : : : :/: : : : : : :. ̄`''ー- 、:.:.:.:.:.:.:.:.:... . .:.:.:.:.:.:!
/ /: : /:.:.:.:.:/: :./: : : /: : : :./: : :/:/: /!: :.i::::``.、:.:.:.:.:.:.:.:.:.:.:.:.:.:!
. /: :./:.:.:.:.:.:! : /: : : / : : : /: : :/:/!:./ |:.:.l|: : :.:.::::\:.:.:.:.:.:.:.:.:.:.|
/Vlハ|/!/!|: : !: : : :! : : :.,'!: :.:/:/ |,' |: :|!: :! : i:.:.::::ヽ.:.:.:.:.:.:.:.:l
,イ /|: :.|: : : :|: : : :.!|: :/:/ |! .|:.リ|: :|:.:.:|: : : : :ハ:.:.:.:.:.:.!
. / / ! ,r|: : : :|: :.'"丁/ ̄` |! !,'十ァ!、:.|: : : :.|: !:`! _,/
|:.! |: : : :| ,rfj ̄ヾ、 ! / |ム」_:リ!: : :.,':.:|:::「
| ト.|: : : :K {| ::::::リ l / ,イ}:::::::ハ,!: :.:/:.:.,'::::|
V:.ハ: : :.| ゛ー '' K.__,/ }:.:.:/:.::/::::リ
V: |: : :ト . xxxx ,. `"''" //}:::/: :.,' ただちに逃げてください...
V:ハ : |:::\ __ "'''''' /イ:::::/: :./
リハハヽ-t`/ \ _,. イ//l/!/|/!
,..、 / /~\ ヽ‐、 / / / リ
/: : :\ _ __,.ィ| イ ,.へ `< ヽr‐ァ―=‐、
くr! : : : : : }フ´ \ ̄ハ:.:.:.:ハ イ ,、〆``ー /:.:/::/ ハ
. |ト、: : : : :/ ヘ::|: !.:.:.:ハ ∨ ̄ / .:/::/ / i!
ただちににげろのガイドライン
http://www.geocities.jp/ust7800870/index.html
ドイツ4月7日予想
ttp://www.geocities.jp/ust7800870/img/2011_04_07.jpg
http://www.dwd.de/
0563デフォルトの名無しさん
2011/04/05(火) 19:53:59.154/7 予測 http://up3.viploader.net/ippan/src/vlippan198234.jpg
発表はドイツ気象庁 http://www.dwd.de/
0564デフォルトの名無しさん
2011/04/05(火) 23:08:18.220565デフォルトの名無しさん
2011/04/05(火) 23:17:20.680566デフォルトの名無しさん
2011/04/06(水) 02:09:05.84ダウンキャストとunionで同じ事をするソース見せて。
0567デフォルトの名無しさん
2011/04/06(水) 22:12:30.96unionと同じようなことをさせるキャストはダウンキャストは呼ばないんじゃないか?
0568デフォルトの名無しさん
2011/04/07(木) 03:35:56.79引数でバリアント型を含むクラスを使うか目的のクラスにキャストして使うか迷っていました
>>567
たしかにそうですね、、、失礼しました
0569デフォルトの名無しさん
2011/04/07(木) 16:23:40.36int a,b,c;
char* p;
};
Boo boo = {};
・・・
boo = Boo(); //これ
構造体をこのようにクリアするのはまずいですか?
他にいい方法ありますか?
0570デフォルトの名無しさん
2011/04/07(木) 16:35:54.520571デフォルトの名無しさん
2011/04/07(木) 17:45:46.170572デフォルトの名無しさん
2011/04/07(木) 18:16:18.750573デフォルトの名無しさん
2011/04/07(木) 18:59:13.030574デフォルトの名無しさん
2011/04/07(木) 19:12:00.410575デフォルトの名無しさん
2011/04/07(木) 19:13:32.370576デフォルトの名無しさん
2011/04/07(木) 20:26:25.130577デフォルトの名無しさん
2011/04/07(木) 20:40:34.18Boo boo={0,0,0,""};
でいんじゃね?
0578デフォルトの名無しさん
2011/04/07(木) 20:46:03.700579デフォルトの名無しさん
2011/04/07(木) 20:50:22.15PODならmemsetで問題なし
0580デフォルトの名無しさん
2011/04/07(木) 21:01:35.93あいたたたたた
0581デフォルトの名無しさん
2011/04/07(木) 21:06:51.15Boo ForClear ={0};
Boo Using;
//dododo
Using = ForClear;
とか・・・。
0583デフォルトの名無しさん
2011/04/07(木) 21:25:09.86ForClearはstatic constにしておけば最適化で即値代入になってくれるんじゃね。
0584デフォルトの名無しさん
2011/04/07(木) 21:51:05.66横からだけど、それいいね。
一回初期化されればあとはメモリのコピーコストくらいか。スタックもそんなに食わないし。
バッドノウハウには違いないが、悪くないかも??
0585デフォルトの名無しさん
2011/04/07(木) 22:07:14.33memsetはどんなにコンパイラが最適化しようと
ループを使わざるを得ないから効率が悪い。
実行途中の初期化はそれ使うことにする。
0586デフォルトの名無しさん
2011/04/08(金) 01:00:04.24ポインタや浮動小数点数は memset() で 0 埋めしても 0 になるとは限らないぞ。
0587デフォルトの名無しさん
2011/04/08(金) 01:04:19.19ダウト〜
バウンダリでサイクル合わせたりアンロールもできる
アセンブラ覗いてみればわかること
0588デフォルトの名無しさん
2011/04/08(金) 01:06:26.76引数でバリアント型を含むクラスを使うのと目的のクラスにキャストして使うのとで同じことするソース見せて。
0589デフォルトの名無しさん
2011/04/08(金) 03:14:21.23BOOST_PP_IIF_BOOST_PP_EQUALと結合されてしまうんですがどうにかしてBOOST_PP_EQUALは使えないんでしょうか。
0590デフォルトの名無しさん
2011/04/08(金) 03:42:49.90次からはboostスレできこうね
0591デフォルトの名無しさん
2011/04/08(金) 05:02:59.28なんであいたたなの?
0592591
2011/04/08(金) 05:04:10.15無理ね。
0593デフォルトの名無しさん
2011/04/08(金) 10:55:37.25テキストファイルを読み込んで、行へ分割して、出力しているのですが。
まれに、x行目(x+1)行目と改行なしで続けて出力されます。
#include <string>
using namespace std;
#define CashSize (1<<18)
int main() {
char *fn = "sample.txt";
FILE *fp = fopen( fn , "rb" );
FILE *fq = fopen( "outfile.txt" , "wb" );
string Cash;
unsigned int m, n;
while ( !feof(fp) ) {
m = Cash.size(); Cash.resize( m + CashSize );
n = fread( &Cash[m], 1, CashSize, fp);
Cash.resize( m + n );
m = 0;
while(1) {
for( n=m; n<Cash.size(); n++ ) if(Cash[n]=='\n' || Cash[n]=='\r') break;
if( n >= Cash.size() ) break;
if(m<n) { string t = Cash.substr(m,n-m)+"\n"; fwrite( &t[0], 1, t.size(), fq); }
m=n+1; }
Cash = Cash.substr(m); }
fwrite( &Cash[0], 1, Cash.size(), fq);
fclose(fp); fclose(fq); }
0594デフォルトの名無しさん
2011/04/08(金) 10:58:48.480595デフォルトの名無しさん
2011/04/08(金) 11:12:40.43ぱっと見ではよくわからんが、その程度の処理でよくわからんコードになってる
というのがまず間違いだろうな。
「長いソースを貼るときは」 >>5
変数名をちゃんとつけて、使い回しをやめろ。
エラーチェック抜けてる。
× cash ○ cache そもそも >>594 を見ると「キャッシュ」じゃなくて「バッファ」でしょ。
#include <cstdio> 抜けてる。
CashSize は unsigned int const で。
それ以前に、何を見て「遅いので」と言ってるのかがまず怪しい気がしてきた。
0596デフォルトの名無しさん
2011/04/08(金) 11:38:56.16#include <stdio.h>
#include <string.h>
#define BuffSize (1<<10)
int main() {
FILE *fp = fopen( "sample.txt" , "rb" );
FILE *fq = fopen( "outfile.txt" , "wb" );
char buff[BuffSize+1]; int readiti=0, enditi;
while ( !feof(fp) ) {
enditi = readiti + fread( &buff[readiti], 1, BuffSize-readiti, fp);
char *p=&buff[0], *q, *endp=&buff[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break;
if(q==endp) break;
if(q!=p) { fwrite( p, 1, q-p, fq); fwrite( "\n", 1, 1, fq); }
p=q+1; }
readiti=(int)(endp-p);
memmove(buff, p, readiti); }
fwrite( buff, 1, readiti, fq);
fclose(fp); fclose(fq); }
◯間違い
それはさて、先ずは非バッファ版を作って正常に動作させ、速度の検証をするべきだな。
その程度のコードだと、一行ずつ処理しても殆ど遅くならないと思う。
0598デフォルトの名無しさん
2011/04/08(金) 12:35:56.14#include <fstream>
#include <cstdlib>
int main()
{
std::ifstream input("sample.txt");
std::ofstream output("outfile.txt", std::ios::binary);
output << input.rdbuf();
output.close();
return (input.good() && output.good()) ? EXIT_SUCCESS : EXIT_FAILURE;
}
0599デフォルトの名無しさん
2011/04/08(金) 12:37:04.850600デフォルトの名無しさん
2011/04/08(金) 12:42:59.240601デフォルトの名無しさん
2011/04/08(金) 12:45:41.660602デフォルトの名無しさん
2011/04/08(金) 12:57:02.12高速性云々はさておき
入力ファイルは「行で区切られている」からファイルを「そのままコピー」するコードを書けばいいはずだが書かれたコードはそうなっていない
それ以外の要件があるんじゃないのか?
0603デフォルトの名無しさん
2011/04/08(金) 12:57:43.24これで速度に不満があるのか?
#include <iostream>
#include <fstream>
#include <cstdlib>
int main()
{
std::ifstream input("sample.txt");
std::string line;
while(std::getline(input, line))
std::cout << line << std::endl;
return input.good() ? EXIT_SUCCESS : EXIT_FAILURE;
}
0604デフォルトの名無しさん
2011/04/08(金) 12:57:58.86#include <iostream>
#include <string>
#include <vector>
#include <time.h>
#define bufSize (1<<20)
using namespace std;
char *buf;
void vecset1(char *fn, vector<string> &vec) {
FILE *fp = fopen( fn , "rb" ); vec.resize(0);
while ( !feof(fp) ) { fgets(buf,bufSize,fp); vec.push_back(string(buf,strlen(buf))); }
fclose(fp); }
void vecset2(char *fn, vector<string> &vec) {
FILE *fp = fopen( fn , "rb" ); vec.resize(0);
int readiti=0, enditi;
while ( !feof(fp) ) {
enditi = readiti + fread( &buf[readiti], 1, bufSize-readiti, fp);
char *p=&buf[0], *q, *endp=&buf[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break; if(q==endp) break;
if(q!=p) vec.push_back( string(p,q-p) ); p=q+1; }
readiti=(int)(endp-p); memmove(buf, p, readiti); }
vec.push_back( string(buf,readiti) );
fclose(fp); }
int main() {
buf=new char[bufSize]; char *fn="D:/desktop/行をシャッフル/sample.txt"; vector<string> vec; int cl;
cl=clock(); vecset1( fn, vec ); cout<<(clock()-cl)<<endl;
cl=clock(); vecset2( fn, vec ); cout<<(clock()-cl)<<endl; }
0605デフォルトの名無しさん
2011/04/08(金) 13:01:56.96C++ならstreambuf::pubsetbuf()使ってみたら
0606デフォルトの名無しさん
2011/04/08(金) 13:08:20.51#include <fstream>
#include <time.h>
#define bufSize (1<<20)
using namespace std;
char *buf;
void vecset1(char *fn, vector<string> &vec) {
fstream fp(fn); string line; vec.resize(0);
while(getline(fp, line)) vec.push_back(line);
fp.close(); }
void vecset2(char *fn, vector<string> &vec) {
FILE *fp = fopen( fn , "rb" ); vec.resize(0);
int readiti=0, enditi;
while ( !feof(fp) ) {
enditi = readiti + fread( &buf[readiti], 1, bufSize-readiti, fp);
char *p=&buf[0], *q, *endp=&buf[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break; if(q==endp) break;
if(q!=p) vec.push_back( string(p,q-p) );
p=q+1; }
readiti=(int)(endp-p); memmove(buf, p, readiti); }
vec.push_back( string(buf,readiti) );
fclose(fp); }
int main() {
buf=new char[bufSize]; char *fn="sample.txt"; vector<string> vec; int cl;
cl=clock(); vecset2( fn, vec ); cout<<(clock()-cl)<<endl;
cl=clock(); vecset1( fn, vec ); cout<<(clock()-cl)<<endl; }
0607デフォルトの名無しさん
2011/04/08(金) 13:09:12.91#include <iostream>
#include <string>
#include <vector>
そもそも、その比較じゃディスクキャッシュも効いちゃうのだけどね。
0609デフォルトの名無しさん
2011/04/08(金) 13:12:41.14そのために、>>606はC++の行読み込みを、後にしたよ。それでも遅い。
0610デフォルトの名無しさん
2011/04/08(金) 13:15:41.55どこが間違えているのかわからないっていう質問なんですが。
およそテキスト10Mで2カ所ほど、改行が無くなって一つの行になにってしまいます。
0611606
2011/04/08(金) 13:28:33.22繰り返し速度を測ったけど、標準は圧倒的に遅い。
int main() {
buf=new char[bufSize];
char *fn="sample.txt";
vector<string> vec;
for(int n=1; n<20; n++ ) {
int a,b,x;
x=clock(); vecset1( fn, vec ); a=clock()-x;
x=clock(); vecset2( fn, vec ); b=clock()-x;
cout<<n<<"回目: C++行読み込み "<<a/CLOCKS_PER_SEC<<"sec. 独自 "<<b/CLOCKS_PER_SEC<<"sec.\n";
}}
0612デフォルトの名無しさん
2011/04/08(金) 13:33:35.44手元の Cygwin g++ 4.3.4 の -O3 で 10MB ぐらいのテキスト読ませてみたら、
fstream+getline() がだいたい 1.5 倍ぐらい時間かかってた。
順番入れ替えたり何度か繰り返してみたけど、それぐらいで落ち着く。
0613デフォルトの名無しさん
2011/04/08(金) 13:34:56.28vecset1() と vecset2() の結果を入れる vec を2つにわけて比較してやれば
どこで間違ってるかわかるんじゃないの?
0614デフォルトの名無しさん
2011/04/08(金) 13:37:34.31バッファサイズと関係なく遅かったC++行読み込み。
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <time.h>
#define bufSize (1<<20)
using namespace std;
char *buf;
void vecset1(char *fn, vector<string> &vec) {
fstream fp(fn); fp.rdbuf() -> pubsetbuf(buf, bufSize); string line; vec.resize(0);
while(getline(fp, line)) vec.push_back(line); fp.close(); }
void vecset2(char *fn, vector<string> &vec) {
FILE *fp = fopen( fn , "rb" ); vec.resize(0); int readiti=0, enditi;
while ( !feof(fp) ) {
enditi = readiti + fread( &buf[readiti], 1, bufSize-readiti, fp);
char *p=&buf[0], *q, *endp=&buf[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break; if(q==endp) break;
if(q!=p) vec.push_back( string(p,q-p) ); p=q+1; }
readiti=(int)(endp-p); memmove(buf, p, readiti); }
vec.push_back( string(buf,readiti) ); fclose(fp); }
int main() {
buf=new char[bufSize]; char *fn="sample.txt"; vector<string> vec; int n,a,b,x;
for(n=1; n<20; n++ ) {
x=clock(); vecset1( fn, vec ); a=clock()-x;
x=clock(); vecset2( fn, vec ); b=clock()-x;
cout<<n<<"回目: C++行読み込み "<<a/CLOCKS_PER_SEC<<"sec. 独自 "<<b/CLOCKS_PER_SEC<<"sec.\n";}}
0615デフォルトの名無しさん
2011/04/08(金) 13:43:10.45どこが間違えるか比べるのは既にやったのですが。原因がわからないです。ほぼ一致します。
5メガ程度だと完全一致する事もあって10メガだと2個程度、間違えたりします。
0616デフォルトの名無しさん
2011/04/08(金) 13:56:08.04サンクス。いつもはボーランドだけど、VC2008で最適化したら1.657倍だった。
0617デフォルトの名無しさん
2011/04/08(金) 13:58:03.47ざっと見た感じ そのコードはバッファの先頭に改行がきたら出力されないでしょうね
テキストの先頭に改行がある場合と、バッファリングで改行がバッファ先頭にきたら改行無視される
0618614, 610
2011/04/08(金) 14:05:26.060620デフォルトの名無しさん
2011/04/08(金) 14:06:43.200621610、614
2011/04/08(金) 14:13:21.540622デフォルトの名無しさん
2011/04/08(金) 14:17:18.61ここですか?
元テキストが改行で終わっていない場合、未出力部分が残ってしまうと思うのですが。
> vec.push_back( string(buf,readiti) ); fclose(fp);
0623デフォルトの名無しさん
2011/04/08(金) 14:24:17.95個人的には有り得ないけど。
0624デフォルトの名無しさん
2011/04/08(金) 14:26:54.30おまけに、偶然バッファの先頭に改行が来たらそいつも無視する仕様ってことで一つw
0625デフォルトの名無しさん
2011/04/08(金) 14:39:32.75これでいいですか。
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <time.h>
using namespace std;
#define bufSize (1<<20)
char *buf;
void vecset(char *fn, vector<string> &vec) {
vec.resize(0);
FILE *fp = fopen( fn , "rb" );
int readiti=0, enditi;
while ( !feof(fp) ) {
enditi = readiti + fread( &buf[readiti], 1, bufSize-readiti, fp);
char *p=&buf[0], *q, *endp=&buf[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break;
if(q==endp) break;
if(q!=p) vec.push_back( string(p,q-p) );
p=q+1; }
readiti=(int)(endp-p); if(readiti) memmove(buf, p, readiti); }
if(readiti) vec.push_back( string(buf,readiti) ); fclose(fp); }
int main() {
buf=new char[bufSize]; char *fn="sample.txt";
vector<string> vec;
//速度測定
double x=clock(); vecset( fn, vec ); cout<<(clock()-x)/CLOCKS_PER_SEC<<"sec.\n";
//出力
fstream fp("outfile.txt", ios::out ); for( int n=0; n<vec.size(); n++ ) fp<<vec[n]<<endl; fp.close(); }
0626デフォルトの名無しさん
2011/04/08(金) 14:42:25.920628デフォルトの名無しさん
2011/04/08(金) 14:59:22.47バッファを越える長さの行があると破綻するね。
0630610、614
2011/04/08(金) 15:39:39.21#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <time.h>
using namespace std;
#define bufSize (1<<6)
char *buf;
void vecset(char *fn, vector<string> &vec) {
vec.resize(0);
FILE *fp = fopen( fn , "rb" );
int readiti=0, enditi; string bigstr;
while ( !feof(fp) ) {
enditi = readiti + fread( &buf[readiti], 1, bufSize-readiti, fp);
char *p=&buf[0], *q, *endp=&buf[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break;
if(q==endp) break;
if(q!=p || bigstr.size()>0 ) { vec.push_back( bigstr + string(p,q-p) ); bigstr.resize(0); }
p=q+1; }
readiti=(int)(endp-p); if( readiti==0 ) continue;
if(p!=&buf[0]) { memmove(buf, p, readiti); continue; }
bigstr += string(p, readiti); readiti=0;
}
if( readiti>0 || bigstr.size()>0 ) vec.push_back( bigstr + string(buf,readiti) );
fclose(fp); }
int main() {
buf=new char[bufSize]; char *fn="sample.txt"; vector<string> vec;
double x=clock(); vecset( fn, vec ); cout<<(clock()-x)/CLOCKS_PER_SEC<<"sec.\n";
fstream fp("outfile.txt", ios::out ); for( int n=0; n<vec.size(); n++ ) fp<<vec[n]<<endl; fp.close(); }
0631デフォルトの名無しさん
2011/04/08(金) 15:45:45.830632610、614
2011/04/08(金) 16:53:22.11対象が100ギガほどなら、入出力とメモリ管理が決定的に重要なはず。
Mersenne Twister でランダムに行をシャッフル (2) - ny23の日記(シャッフル)
http://d.hatena.ne.jp/ny23/20100803/p1
そ〜太 2nd(ソート)
http://www.vector.co.jp/soft/win95/util/se127691.html
0633デフォルトの名無しさん
2011/04/08(金) 20:41:13.770634デフォルトの名無しさん
2011/04/08(金) 23:11:57.55そんな神経質になる必要あるんかな。
0635デフォルトの名無しさん
2011/04/08(金) 23:22:30.510636デフォルトの名無しさん
2011/04/09(土) 16:28:41.83#include <iostream>
#include <bitset>
using namespace std;
int main() {
bitset<100> a;
a[1]=3;
cout<<a[1]<<endl;
}
0637デフォルトの名無しさん
2011/04/09(土) 16:34:05.630638デフォルトの名無しさん
2011/04/09(土) 16:46:04.38#include <iostream>
using namespace std;
class bitset_mini {
int x;
public:
bool operator [] ( unsigned int n ) { return (x>>n)&1 ; }
};
int main() {
bitset_mini z;
cout<< z[1] <<endl;
z[1]=3; //これの動かし方がわからない。
}
0639デフォルトの名無しさん
2011/04/09(土) 16:48:34.56C++では無理。
C#のプロパティならできる。
0640デフォルトの名無しさん
2011/04/09(土) 16:52:33.150641デフォルトの名無しさん
2011/04/09(土) 16:53:47.280642デフォルトの名無しさん
2011/04/09(土) 17:07:04.180643デフォルトの名無しさん
2011/04/09(土) 17:08:32.57自力でやってみます
0644デフォルトの名無しさん
2011/04/09(土) 17:47:04.63#include <iostream>
using namespace std;
template <class cls> class one_bit {
cls *x; unsigned int k;
public:
one_bit( cls *y , unsigned int n ){ x = y; k=n; }
void operator = ( int n ) { *x |= (n&1)<<k ; } //代入
operator cls() { return ((*x)>>k)&1; } //表示
};
class bitset_mini {
int x;
public:
one_bit<int> operator [] (unsigned int n) { return one_bit<int>(&x, n); }
};
int main() {
bitset_mini z;
cout<< z[1] <<endl;
z[1]=3;
cout<< z[1] <<endl;
}
0645デフォルトの名無しさん
2011/04/09(土) 17:50:04.320646デフォルトの名無しさん
2011/04/11(月) 05:48:41.40void hoge() throw() {}
これにはどういう意味があるのでしょうか?
- 例外が発生するくらいなら強制終了させる
- ただ例外が発生し得ないことを明示しているだけ
- その他
0647デフォルトの名無しさん
2011/04/11(月) 06:53:13.80意味については自分で答えが出てるみたいだけど、ほんとは何が聞きたいの?
0648デフォルトの名無しさん
2011/04/11(月) 07:18:33.35Visual C++ではunexpectedがまともに動きませぬ
0649デフォルトの名無しさん
2011/04/11(月) 09:11:04.700650デフォルトの名無しさん
2011/04/11(月) 13:37:58.41C++0x 12
http://hibari.2ch.net/test/read.cgi/tech/1298470844/
0651デフォルトの名無しさん
2011/04/12(火) 00:27:52.91処理が同じconstメンバ関数と非constメンバ関数をもっとスマートに記述する方法ありますか?
class Hoge
{
public:
string & GetName() { return this->name; }
const string & GetName() const { return this->name; }
private:
string name;
};
「return this->name;」の部分がもっと複雑だったばあいの処理を一箇所にまとめたいんだけど・・・
0652デフォルトの名無しさん
2011/04/12(火) 00:57:44.440653デフォルトの名無しさん
2011/04/12(火) 01:02:34.170654デフォルトの名無しさん
2011/04/12(火) 01:03:16.24const string & GetName() const { return this->name; }
string& GetName()
{
return const_cast<string&>( (static_cast<const Hoge*>(this)->GetName() )
}
0655デフォルトの名無しさん
2011/04/12(火) 01:16:32.98やっぱりそれしか無いか・・・
0656デフォルトの名無しさん
2011/04/12(火) 01:56:55.50設計を見直す。
0657デフォルトの名無しさん
2011/04/12(火) 02:00:25.850658デフォルトの名無しさん
2011/04/12(火) 02:19:32.14設計を見直すために参考になるソース等を頂けるとうれしいです
>>656
あーいや、ちょっとソースが見づらくなるなと思っていたんだ
0659デフォルトの名無しさん
2011/04/12(火) 09:43:24.500660デフォルトの名無しさん
2011/04/12(火) 10:38:40.81別にcppの中に掩蔽してしまえばいいんでね?
そもそも割と有名なイディオムだからそんなに可読性は落ちない
気持ち悪く思うのは最初だけ
0661デフォルトの名無しさん
2011/04/12(火) 14:07:50.17非const側の関数の問題?
この関数を削除して、変数nameを操作する関数をHogeクラスに追加するのが面倒だと思った
危険性は理解しているし、使いどころを分けているから大丈夫
>>660
そういうものか。これからそうするようにしてみるよ
0662655
2011/04/12(火) 19:01:44.37自分は大体の場面で下記のような定義をするんだけど、
Outerクラスについてのレビューをして頂けますか?
class Inner
{
public:
typedef boost::shared_ptr<Inner> shared_ptr;
typedef boost::shared_ptr<const Inner> shared_const_ptr;
shared_ptr Create() { return shared_ptr(new Inner()); }
};
class Outer
{
public:
Outer()
: inner(Inner::Create()) {}
void SetValue(int value) { this->value = value; }
int GetValue() const { return this->value; }
// void SetName(const string & value) { this->name = value; }
string & GetName() { return this->name; }
const string & GetName() const { reeturn this->name; }
void SetInner(const Inner::shared_ptr & value) { this->inner = value; }
Inner::shared_ptr GetInner() { return this->inner; }
Inner::shared_const_ptr GetInner() const { return this->inner; }
...
0663655
2011/04/12(火) 19:03:52.32private:
int value;
string name;
shared_ptr inner;
};
nameの変更を保護したいばあいは
「string & GetName() { return this->name; }」
を定義しない
nameを保護しないで、string型のメンバ関数を自由に使いたいばあいは
「void SetName(const string & value) { this->name = value; }」
を定義しない
独学な部分が多々あるから、何かとんでもないミスをしていて、自分がそれに気付いていないのかもと思った
0664デフォルトの名無しさん
2011/04/12(火) 21:08:05.36存在しない参照が残る可能性を残すデメリットよりも、
コピーによるデメリットが大きいかどうかじゃないだろうか
実際参照を返すことが最良な場合だってあるわけだし
ところで蛇足ではあるがCreateはstaticでは?
0665デフォルトの名無しさん
2011/04/12(火) 23:16:08.72>>662って、それ以外になんかのメリットあるのかな。
そう記述することの意図が汲み取れなくてごめん。
0666655
2011/04/13(水) 00:23:50.70[修正]
shared_ptr Create() { return shared_ptr(new Inner()); }
↓
static shared_ptr Create() { return shared_ptr(new Inner()); }
shared_ptr inner;
↓
Inner::shared_ptr inner;
変数nameの非const GetName() については、例えば outer->GetName().replace(... とかそんな感じで使用することを想定しています
非const参照を得る方法を提供しないで、Outerクラスで同じ関数を用意するべきですか?
実際は非const側の GetName() はほとんど使わないのですが
void GetName(string * pOutput) {
*pOutput = this->name;
}
とかの方がいいですか?
0667デフォルトの名無しさん
2011/04/13(水) 02:58:50.33だからさ、どうするべきかってのは要求に応じて変わるんだよ。
要求や心配している点を示さずに「するべきですか?」とか「〜の方がいいですか?」とか
聞かれても何とも言いにくい。何を言っても後で「実は・・・」とか出てきそうでな。
0668655
2011/04/13(水) 03:45:11.72第一要求として速度重視。その次にコードの見易さ
0669デフォルトの名無しさん
2011/04/13(水) 04:00:59.73その要求なら参照返しでFA。
コピーしたら遅くなるし、コードの見易さも変わらないからね。
放り出した参照がどこかで握られてるかもしれないっていう点で
見易さが損なわれてるかもしれないけど、速度のほうが優先みたいだし。
0670デフォルトの名無しさん
2011/04/13(水) 04:03:22.42速度が要らないところで安全にコピーを返す Name() も両方付けとくとか。
0671デフォルトの名無しさん
2011/04/13(水) 13:32:17.67JavascriptではSpiderMonkeyとかV8はありますが。
0672デフォルトの名無しさん
2011/04/13(水) 16:02:22.40メソッドチェインが使いたかった、と書けばいいのに
0673デフォルトの名無しさん
2011/04/13(水) 16:45:46.94PHPEmbed ってのがあるらしい
0674デフォルトの名無しさん
2011/04/13(水) 17:45:14.31サンクス
0675デフォルトの名無しさん
2011/04/13(水) 18:46:49.14質問の対象範囲外だとは思うけどまずはメンバのアクセサ提供する必要があるのかを問題にするべきだと思う。
特に shared_ptr を外部から設定できるとか NULL 設定されてもいいのかよ、みたいな。
メンバの参照さらしたりセットできるってことはクラス内で常にメンバが満たしているべき条件が保証できないかもしれない。
0676デフォルトの名無しさん
2011/04/13(水) 21:19:01.02何かいいライブラリありますか。OSなどがおこなうメモリ管理と同じような事と思いますが。
0677デフォルトの名無しさん
2011/04/13(水) 21:33:15.730678デフォルトの名無しさん
2011/04/13(水) 21:36:27.44メモリの再確保をしたくないのですが。
速度のため。
0679デフォルトの名無しさん
2011/04/13(水) 21:39:07.84確保したメモリ全体を
○○●●○○○○●○○●●●○○○として。
白い○部分から、必要なメモリを確保してきたいって事です。
空きが無くなったら、登録を外して外部記憶へ書き出します。
0680デフォルトの名無しさん
2011/04/13(水) 21:39:13.590681デフォルトの名無しさん
2011/04/13(水) 21:41:16.040682デフォルトの名無しさん
2011/04/13(水) 21:41:54.30C以外だと
0683デフォルトの名無しさん
2011/04/13(水) 21:43:03.390684デフォルトの名無しさん
2011/04/13(水) 21:43:52.55動的確保でやってみてボトルネックになっていてから、こだわることにします。
0685デフォルトの名無しさん
2011/04/13(水) 21:49:38.94それともOSが載ってなかったりするの?
0686デフォルトの名無しさん
2011/04/13(水) 21:50:16.94これはごくごく一般的なメモリアロケータがやる仕事と同じでは?
メモリが足りなくなったときの動作が違うけど
なので、適当なアロケータのソースを見ればよいと思う
基礎知識が何もないのなら
http://video.google.com/videoplay?docid=2914803742593360351#
この辺が参考になるかも
0687684
2011/04/13(水) 21:58:02.3916M分使うと、32M確保してたら、その差の部分をバッファに使った方が得なんですが。
0688デフォルトの名無しさん
2011/04/13(水) 22:01:02.35いやだから、気になってるのがSTLなら、いきなりアロケータを手作りせずに
単にmalloc()やnew使えばいいでしょ
0689デフォルトの名無しさん
2011/04/13(水) 22:02:18.87そして内部で切り分けたらいいよ
0690デフォルトの名無しさん
2011/04/13(水) 22:03:29.44その切り分けをして空いた領域を取得する上で
フりーリスト管理なりベストマッチサーチなりの
アルゴリズムがいるわけで、要するにやることがメモリアロケータと全く一緒
0691デフォルトの名無しさん
2011/04/13(水) 22:37:22.29CPUがひまそうなときに縮めればいいと思うよ。縮められるから。
0692デフォルトの名無しさん
2011/04/13(水) 23:13:02.83これだけのことを把握して実測できる技術力を持ちながら、こんなところでこんな聞き方しかできないアンバランスさ。
0693デフォルトの名無しさん
2011/04/13(水) 23:20:50.330694デフォルトの名無しさん
2011/04/13(水) 23:31:12.150695デフォルトの名無しさん
2011/04/14(木) 01:11:41.34std::vector 使うとしても reserve() するとか swap() による shrink to fit を使うとかすれば
そこらへんの問題もどうにかなるだろ。
0696デフォルトの名無しさん
2011/04/14(木) 01:20:16.520697デフォルトの名無しさん
2011/04/14(木) 01:45:45.560698デフォルトの名無しさん
2011/04/14(木) 01:54:56.27boost::pool は固定長で大量の確保を高速化するものだったような気がする。
>>676,679 みたいな可変長の要求にも役に立つのかね?
0699デフォルトの名無しさん
2011/04/14(木) 02:00:59.98それはfast_pool_allocatorで実際はpool_allocatorが役に立つ。
0700デフォルトの名無しさん
2011/04/14(木) 07:55:46.16ただの馬鹿だったか
0701デフォルトの名無しさん
2011/04/14(木) 08:21:47.03>って事です。
ここまでのはSimple Segregated Storageってのでそのまま実現できる。boost::pool_allocatorも同じ方式
>空きが無くなっ
これは自分で実装する必要があると思う
0702デフォルトの名無しさん
2011/04/14(木) 15:07:12.87が正解でないか?
0703デフォルトの名無しさん
2011/04/14(木) 15:41:08.260704デフォルトの名無しさん
2011/04/14(木) 17:23:29.570705デフォルトの名無しさん
2011/04/14(木) 17:26:52.790706655
2011/04/14(木) 17:31:51.49>>669
実際に参照を多用しているんだけど、結構危ないのかなぁと思ったんだ
でも、外部からメンバ参照を操作されたくなければ string & GetName() 非const を提供しなければいい話だし
>>672でも言われている通りメソッドチェインが使えると効率がいいからなぁ
>>675
一応だが、>>662のソースコードではshared_ptrの参照は非constでは返してない。
shared_ptrでの戻り値は習慣的に値返ししているけど、
「const Inner::shared_const_ptr & GetInner() const { ... } 」
みたいに const shared_ptr & を返すのもアリなんですか?
マルチスレッドだと値返しは危ないという理解で合ってますか?
>>670
関数名は考慮が必要かもしれませんが、
「const string & GetNameA() const」が存在する状況でコピーを返す関数、例えば
「void GetNameB(string * pName) const」は必要ありますか?
参照を取得できれば、外部から「string s(outer.GetNameA());」といった感じにコピーできるので・・・
0707655
2011/04/14(木) 17:32:16.16>>669
実際に参照を多用しているんだけど、結構危ないのかなぁと思ったんだ
でも、外部からメンバ参照を操作されたくなければ string & GetName() 非const を提供しなければいい話だし
>>672でも言われている通りメソッドチェインが使えると効率がいいからなぁ
>>675
一応だが、>>662のソースコードではshared_ptrの参照は非constでは返してない。
shared_ptrでの戻り値は習慣的に値返ししているけど、
「const Inner::shared_const_ptr & GetInner() const { ... } 」
みたいに const shared_ptr & を返すのもアリなんですか?
マルチスレッドだと値返しは危ないという理解で合ってますか?
>>670
関数名は考慮が必要かもしれませんが、
「const string & GetNameA() const」が存在する状況でコピーを返す関数、例えば
「void GetNameB(string * pName) const」は必要ありますか?
参照を取得できれば、外部から「string s(outer.GetNameA());」といった感じにコピーできるので・・・
0708655
2011/04/14(木) 17:33:42.340709デフォルトの名無しさん
2011/04/14(木) 19:49:05.280710デフォルトの名無しさん
2011/04/14(木) 20:17:04.10ただ、それを行うライブラリとかの存在はしらない。
0711デフォルトの名無しさん
2011/04/14(木) 20:39:51.88http://zlib.net/
ここのexampleとmanual見ればいいんじゃないか
ちょっと見てみたら、メモリに展開するって書いてあったし
0712デフォルトの名無しさん
2011/04/14(木) 20:57:52.160713デフォルトの名無しさん
2011/04/14(木) 21:08:58.71パワーポイントの方は見た事あったけど、動画は初めて見たわ。
面白かった。ていうか、じゃんじゃんうっせーよw
0714デフォルトの名無しさん
2011/04/14(木) 21:21:33.18コンテナとコーデック
0715デフォルトの名無しさん
2011/04/14(木) 22:02:05.78てっきりzipの読み込みまで入っているのかと思ってた
一応サンプルにminizipってのがあるらしいから、参考にはできるかもしれないけど
7zipもzip使えるみたいだから、そっちの方が楽かな?
0716デフォルトの名無しさん
2011/04/14(木) 22:16:58.510717デフォルトの名無しさん
2011/04/14(木) 22:23:35.570718デフォルトの名無しさん
2011/04/14(木) 22:30:46.13言いたかったのは SetInner(Inner::shared_ptr()); されてもいいのか?って事。使う時に毎回有効性のチェックする?
もっと言うとクラスのインタフェースはその機能によって定められるべきで
メンバによって定められるべきではないと思う。本当にアクセサが必要なの?
>const shared_ptr & を返すのもアリなんですか?
個人的にはナシ。
>マルチスレッドだと値返しは危ないという理解で合ってますか?
いや、まずいのは参照返しの方だろ?
実体より寿命の長い参照に設定された場合が駄目なのでマルチスレッドでなくても
駄目な場合は発生しうる。
>「void GetNameB(string * pName) const」は必要ありますか?
>670 が言っているのは string GetNameB() const だと思う。
そして個人的には const string & 返すのがあれば不要だと思う。
むしろ void GetNameB(string &name) const を作るかもね。
0719デフォルトの名無しさん
2011/04/14(木) 23:06:13.73テンポラリに展開なしで出来ますか?
0720デフォルトの名無しさん
2011/04/14(木) 23:27:57.34自分で調べる気一切ないみたいだから諦めた方がいいよ
0721デフォルトの名無しさん
2011/04/15(金) 00:25:08.24マウントとのように動作するライブラリを作れば
何階層でも読みに行けることになる。
0722デフォルトの名無しさん
2011/04/15(金) 12:02:14.30C++の例外と相性がわるいと書かれている記事をみかけました。
リンクしたいC言語で書かれたいライブラリのとある関数のなかで、
setjmpとlongjmpが使用されておりました。
実際には例外処理てきな使われです。
どのような状況で利用するとC++的にはまずいのでしょうか?
0723デフォルトの名無しさん
2011/04/15(金) 12:03:49.75例外と共存させるとデストラクタが呼ばれないので拙い(。
Cで書かれたいライブラリの中で閉じている分には無関係。
0724デフォルトの名無しさん
2011/04/15(金) 12:12:22.54if (setjmp(...) == 0) {
tryブロック相当
longjmp()を呼ぶかもしれないCの関数を呼んだりとかする
} else {
longjmp()がよばれた。エラー処理とかする
}
こんな感じの書き方になると思うけど、上のtryブロック相当のところで
デストラクタ呼び出しが必要なC++コードを記述してしまうと
デストラクタが呼ばれなくなってしまう
逆にそうしなければ、基本的には問題ないはず
0725デフォルトの名無しさん
2011/04/15(金) 12:12:48.690726709
2011/04/15(金) 12:39:02.76MP3や画像ビューアなど、テンポラリなしでダイレクトに読みに行くのがあると思うのですが。
0727デフォルトの名無しさん
2011/04/15(金) 12:51:04.35構造になってるけど
deflate圧縮されたファイルの中身は無圧縮zipでない限りは
ランダムアクセス不能なので
シークエンシャルにロードできるような形式でなけば
結局メモリかファイルに一度全体を展開する必要はある
でかいAVIのようなものをを全部オンメモリ展開するのははた迷惑なので、
結局一時ファイルがベストという判断もありえるよ
0728デフォルトの名無しさん
2011/04/15(金) 13:10:22.12レスありがとうございます。
C++の例外機構内で使用しなければよさそうですね。
ありがとうございました。
0729デフォルトの名無しさん
2011/04/15(金) 13:13:33.920730デフォルトの名無しさん
2011/04/15(金) 13:14:46.06いや、実際に問題になるのはデストラクタの利用。
例外送出時の問題はその一例。
0731デフォルトの名無しさん
2011/04/15(金) 13:20:23.48>>724さんの例のようにデストラクタを、
呼ばなければならないシーンを飛ばしてしまうことがある。
なので利用するときはC++での利用は推奨されない。
また、利用先のCライブラリないで閉じているならば問題ではない。
ということでよろしいでしょうか・・・。
0732723
2011/04/15(金) 13:25:19.34あー確かに。例外関係なく、デストラクタを無視しちゃうのが問題だね。
Cで書かれたライブラリ内で閉じている分には関係ないが、
C++のコード内では(事実上)使えないと。
0733デフォルトの名無しさん
2011/04/16(土) 19:27:13.455ギガのzipがあり、その中に500メガ〜1000メガの書庫が格納されている場合、
アクセスのたびにテンポラリに解凍しては激遅になります。
書庫形式からダイレクトに読みにいくのは可能なはずなんですが。
0734デフォルトの名無しさん
2011/04/16(土) 19:53:16.030735デフォルトの名無しさん
2011/04/16(土) 20:34:53.44このソフトはどう動いてるのかわかりますか?
書庫をマウントして、その書庫内もマウントして、読み込めるのですが。
http://itpro.nikkeibp.co.jp/article/COLUMN/20110405/359103/?ST=system
0736デフォルトの名無しさん
2011/04/16(土) 20:43:55.62しかしテンポラリ作らず読んでいそうなソフトもあるが。>>735とか。
0737デフォルトの名無しさん
2011/04/16(土) 20:53:49.70書庫情報には格納前と圧縮後サイズが記録されているから
書庫内の書庫の途中から、ファイルデータを取り出せるはず。
0738デフォルトの名無しさん
2011/04/16(土) 21:01:23.630739デフォルトの名無しさん
2011/04/16(土) 21:29:29.94君が探すべきなのはテンポラリを使わない方法では「なく」、一度作成したテンポラリを
再利用する方法じゃないのかね?
0740デフォルトの名無しさん
2011/04/16(土) 22:46:34.41横レスだが、
質問者の処理の対象となる書庫は、
毎回違うのかもしれんよ。
そのへんの考察もできずに、上から目線とは
目くそ鼻くそかもよw
0741デフォルトの名無しさん
2011/04/16(土) 23:25:49.42かもしれんね。だとすれば >727 で話は終わっている。
0742デフォルトの名無しさん
2011/04/17(日) 01:08:27.67invalid use of non-static data member
とg++にいわれました
何がいけないんでしょう?
0743デフォルトの名無しさん
2011/04/17(日) 01:49:37.62>何がいけないんでしょう?
エラーメッセージも読めないあんたの頭
0744デフォルトの名無しさん
2011/04/17(日) 03:14:40.56メンバ関数が呼ばれるときには、それを実行するインスタンスはわかっているわけで
なぜわかっているはずのメンバ変数をデフォルト引数に突っ込むことができないの?
という話です
0745デフォルトの名無しさん
2011/04/17(日) 03:38:57.21メンバ関数のデフォルト引数としてどのインスタンスの変数が使用されるか特定できないじゃないか
codepadだと↓ならOK。
class T
{
public:
T(){}
~T(){}
static int X;
void func(int y=X){ printf("%d\n",y);}
};
int T::X=3;
0746デフォルトの名無しさん
2011/04/17(日) 10:08:53.52>メンバ関数が呼ばれるときには、それを実行するインスタンスはわかっているわけで
勝手な想像だけど、実現したいことはメンバ関数のオーバーロードで簡単に実現できるのに
デフォルト引数でやろうとすると仕様の整合性をとるのが面倒だったから、とかじゃない?
特に仮想関数のデフォルト引数が静的に解決されるってのあたりと。
struct A { virtual void func(int n = 1) {} };
struct B : public A { virtual void func(int n=3) {} };
B b; A *pa = &b; pa->func();
で、3 で呼び出すの?みたいな。
0747デフォルトの名無しさん
2011/04/17(日) 10:31:39.16分かるわけがない。
確定するのは呼ばれる時ではなく、呼ばれた後。
仮想関数とかクラスの仕組みを勉強し直せ。
0748デフォルトの名無しさん
2011/04/17(日) 13:50:56.71メンバ関数呼ぶ時に this 渡してるんだからそれ使って解決してくれよ、って話じゃないの?
0749デフォルトの名無しさん
2011/04/17(日) 14:33:45.10どのインスタンス(の変数)が使われるかなんて動的にしかわからないじゃん。
0750デフォルトの名無しさん
2011/04/17(日) 15:19:03.44this->hogeも積めるんじゃないかっていう事かな。
0751デフォルトの名無しさん
2011/04/17(日) 16:18:47.90CPUのキャッシュは少ない。沢山の関数がキャッシュに載れば弾かれるものも多くなる。
たとえば5カ所で関数を呼び出すなら、インラインにせずキャッシュから読ませた方が速い。
0752デフォルトの名無しさん
2011/04/17(日) 16:22:03.40HDD << メモリ << CPUキャッシュ
なるべくメモリを読みに行かせない、なるべくHDDを読みに行かせない点がポイント。
インラインは、コーディングでの見やすさの為に分離した場合は有効。
0753デフォルトの名無しさん
2011/04/17(日) 16:25:13.76俺なんか勘違いしてる?
0754デフォルトの名無しさん
2011/04/17(日) 16:26:33.980755デフォルトの名無しさん
2011/04/17(日) 18:38:30.430756デフォルトの名無しさん
2011/04/17(日) 19:02:51.070757デフォルトの名無しさん
2011/04/17(日) 19:24:10.210758デフォルトの名無しさん
2011/04/17(日) 22:15:41.630759デフォルトの名無しさん
2011/04/17(日) 22:46:46.02デフォルトの引数は、コンパイル時に#defineと同じように実命令が変換されるより先に展開されるの。
だからインスタンスがなんなのかなど、コンパイラがその時点で判断できようはずが無い。
なんでそんな簡単なことも理解できないんだ?
0760デフォルトの名無しさん
2011/04/17(日) 22:51:33.80切り分けて考えるんだ。
0761デフォルトの名無しさん
2011/04/17(日) 23:02:00.39どうもそうじゃなかったようだ
0762デフォルトの名無しさん
2011/04/17(日) 23:38:54.09>>718
> 実体より寿命の長い参照に設定された場合が駄目なのでマルチスレッドでなくても
> 駄目な場合は発生しうる。
ごめん、「実体より寿命の長い参照に設定された場合」っていうのはどんな時?
ちょっと分からなかった
0763デフォルトの名無しさん
2011/04/17(日) 23:46:47.71デフォルト引数は静的な型から決定されるからthis使って解決出来ないじゃん。
>>746
この場合は、B::funcの引数には1が渡されるってこと・・・で合ってるよね?
0764デフォルトの名無しさん
2011/04/18(月) 00:55:20.70仮想関数呼び出しの時の this は動的な型になってるから仮想関数の例とか this どうこう書いたのは良くなかったかもしれない。
コンパイラとしては >761 のように解決すれば良いだけだから実装自体は可能だと思う。
ただし、この場合デフォルト引数を「動的」に解決しているわけだから仮想関数のデフォルト引数が「静的」に解決されるのと
仕様的な整合性が取れていないと思う。
それならってんで、仮想関数のデフォルト引数も動的に解決しようとした場合、仮想関数の解決と同様の仕組みを導入しなければならず
メンバ関数のオーバーロードで簡単に実現できることに対してそこまで頑張る必要はない、という判断からデフォルト引数は全て
静的に解決する仕様になったのではないか?、というのが >746 で言いたかったことなんだけど言葉足らずだったかも。
>763
>この場合は、B::funcの引数には1が渡されるってこと・・・で合ってるよね?
合ってる。
0765デフォルトの名無しさん
2011/04/18(月) 07:52:40.48こういう無い物ねだりで余計なことに無駄な時間を割くから、
馬鹿の考え休むに似たりって言われるんだよ。
0766デフォルトの名無しさん
2011/04/18(月) 09:45:58.86逆にしてしまうとライブラリー使うとき全部変換しないといけなさそうで困りますよね☆
0767デフォルトの名無しさん
2011/04/18(月) 12:46:45.890768デフォルトの名無しさん
2011/04/18(月) 13:04:03.78一人で縦書きの世界にこもってろ
0769デフォルトの名無しさん
2011/04/18(月) 13:06:07.710770デフォルトの名無しさん
2011/04/18(月) 15:11:34.58b b b b b
c c c c c
d d d d d
という行列があるとするでしょ?
それを格納するのにabcdabcdabcdabcdとするか
aaaabbbbccccdddddにするのかどちらが普通ですか?
という簡単な質問のつもりですよ?
0771デフォルトの名無しさん
2011/04/18(月) 15:22:52.28X[1]=bbbb
X[2]=cccc
X[3]=dddd
0772デフォルトの名無しさん
2011/04/18(月) 15:25:15.73構文エラー
自前でやるならフラグで解釈を切り替えられるようにしておくと、逆行列が瞬時に得られるw
0774デフォルトの名無しさん
2011/04/18(月) 15:29:06.750775デフォルトの名無しさん
2011/04/18(月) 15:29:40.60が普通じゃないの?
0776デフォルトの名無しさん
2011/04/18(月) 15:30:34.51どっちが普通かきいているのは明らか。
0777デフォルトの名無しさん
2011/04/18(月) 15:48:42.49つまり普通なんてない。
そもそもスレ違い。
0778デフォルトの名無しさん
2011/04/18(月) 15:51:33.93ネットで調べてきます
あした学校なので
ほうか後また書き込みますね。
w
0779デフォルトの名無しさん
2011/04/18(月) 15:56:09.720780デフォルトの名無しさん
2011/04/18(月) 15:58:05.85やっぱパソコンの画面の座標と一致しているのかなぁ。
0781デフォルトの名無しさん
2011/04/18(月) 16:16:35.94まあ普通に4*4の配列でもいいとおもうよ。
コンパイル後は配列のほうが早い場合もおおいらしいしね。
0782デフォルトの名無しさん
2011/04/18(月) 16:22:34.23実際には、可変長の配列の配列は作れないから効率重視ならリニアにメモリを確保してオフセット計算して使うことになる。
その場合、縦か横かはオフセット計算の違いだけになる。
0783デフォルトの名無しさん
2011/04/18(月) 16:41:38.01CPUのパイプラインキャッシュが有効になるかどうかという違いもでてくる
0784709
2011/04/18(月) 17:54:29.887-zip32.DLLというのを使いました。
速度を測ると、書庫内のファイルリスト取得(書庫のopen)がボトルネックになっています。
書庫のファイルリストを高速で取得できるライブラリ、ソースはありますか?
ヘッダ情報を読むだけでそれほど時間かからないはずですが、このDLLは遅いです。
0785デフォルトの名無しさん
2011/04/18(月) 21:07:32.01ボトルネックが判っててそこまで言うならできるでしょ
0786709
2011/04/18(月) 21:36:34.017-zipは多くのフォーマットに対応していいんですが。
7-zipのソースに直接アクセスしてみます。
0787デフォルトの名無しさん
2011/04/19(火) 11:23:11.330788デフォルトの名無しさん
2011/04/19(火) 12:28:29.980789デフォルトの名無しさん
2011/04/19(火) 12:55:26.98#include <iostream>
#include <string>
static std::string enc64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_";
std::string base64enckai(const std::string ch ) {
unsigned int x,n=0; std::string str;
do{ x=0;
if(n+2<ch.size()) memcpy(&x,&ch[n],3);
else if(n+1<ch.size()) memcpy(&x,&ch[n],2);
else memcpy(&x,&ch[n],1);
n+=3;
for(int i=0; i<4; i++) { str+=enc64code[x%64]; x/=64; }
}while(n<ch.size()); return str; }
std::string base64deckai(const std::string ch ) {
static std::string inv; static flg=0;
unsigned int x,n=0,i;
if(!flg) { inv.resize(128); for(i=0;i<enc64code.size();i++) inv[enc64code[i]]=(char)i; }
std::string str;
do {
x=0; for(i=0; i<4 ; i++) x+=inv[ch[n+i]]<<(6*i);
n+=4;
i=str.size(); str.resize(i+3); memcpy(&str[i],&x,3);
}while(n<ch.size()); return str; }
int main(){
std::string a="C++に関する質問やら話題やらはこちらへどうぞ。";
std::string b=base64enckai(a);std::string c=base64deckai(b);std::string d=base64enckai(c);
std::cout<<"moto a=\""<<a<<"\"\n"<<"test b=enc(a); c=dec(b); d=enc(c);\n";
std::cout<<"a==c? "<<(a==c?"True":"False")<<"\n";
std::cout<<"b==d? "<<(b==d?"True":"False")<<"\n"; }
0790709
2011/04/19(火) 14:09:29.72ソース落として動かそうとしたらわかりませんでした。
0791デフォルトの名無しさん
2011/04/19(火) 15:15:03.02http://ideone.com/p4aEb
0792デフォルトの名無しさん
2011/04/20(水) 10:31:09.71下位の書庫の存在確認のために、上位から順に開いていって確かめてました。
格納ファイル情報もキャッシュしたら解消できました。
0793デフォルトの名無しさん
2011/04/20(水) 10:41:25.67おすすめはなにがありますか?
NULLポインタアクセスとメモリリーク検知が出来れば
あとはまあどうでもいいです。
0794デフォルトの名無しさん
2011/04/20(水) 10:49:53.480795デフォルトの名無しさん
2011/04/20(水) 11:04:30.88int buf[64];
Boo* b = new(buf) Boo[3];
とやると
buf[0]に3が入ったり入らなかったりするんですがどういう規定があるんでしょうか。
0796デフォルトの名無しさん
2011/04/20(水) 11:09:19.73規定がないのでゴミが残る
0797デフォルトの名無しさん
2011/04/20(水) 14:10:13.05よくある実装では、 Boo に対してデストラクタ呼び出しが必要かどうかで変わる。
その場合 3 が入ってるかどうかと static_cast<void*>(b) != &buf[0] が連動してるはず。
0798デフォルトの名無しさん
2011/04/20(水) 14:14:40.86cppcheck とかいうやつがあるから使ってみれば?
http://sourceforge.net/apps/mediawiki/cppcheck/
結果を教えてもらえるとうれしい。
初歩的なメモリリーク検知には grep delete ... でも有効だったりする。
単品 delete があれば std::auto_ptr に、配列 delete があれば std::vector に変えて消していく。
0799デフォルトの名無しさん
2011/04/20(水) 14:23:11.060800デフォルトの名無しさん
2011/04/20(水) 14:30:22.51ちょっwww、どうやってVCで検査すんお!??
0801デフォルトの名無しさん
2011/04/20(水) 14:45:30.410802デフォルトの名無しさん
2011/04/20(水) 14:48:33.42http://www7b.biglobe.ne.jp/robe/pf/pf008.html
メモリリークの自動検出をしてみる - ベイダー日記
http://d.hatena.ne.jp/wata_d/20080304/1204609100
気まぐれソフトハウス ≫ メモリリークの検出
http://wind-master.dip.jp/soft-info/item/62
0803デフォルトの名無しさん
2011/04/20(水) 14:51:42.25BCC、crtdbg.hの中身。
Borland version of Microsoft CRTDBG.H header file This is used by MFC and ATL.
0804デフォルトの名無しさん
2011/04/20(水) 14:55:44.27ttp://msdn.microsoft.com/ja-jp/library/x98tx3cf(v=VS.80).aspx
0805デフォルトの名無しさん
2011/04/20(水) 14:56:13.34>793が欲しいのは性的解析ツールだぞ。
0806デフォルトの名無しさん
2011/04/20(水) 15:07:52.02ありがと〜、おまえら優しすぎて涙が出てきた。
いままで自作のアロケーター作ってそこに開放し忘れ機能しこんでたお。
0807デフォルトの名無しさん
2011/04/20(水) 15:08:27.89コンパイルに出来た気が。
解析に時間かかりすぎて使ったことはないが。
0808デフォルトの名無しさん
2011/04/20(水) 15:15:47.03CodeGuardがあるだろ
0809デフォルトの名無しさん
2011/04/20(水) 15:41:55.15/analyze スイッチか
vcユーザーにとっては一番手軽だな
0810デフォルトの名無しさん
2011/04/20(水) 16:08:46.43現時点では、SALの解釈(/analyze)はVSTSのTeam Developerで有効になっていますが、
最新のWindows SDKに付属のC++コンパイラで利用できる事を確認してます。(※2)
二流プログラマの三流な日常: VC++の開発に於いてSALを使う
http://konuma.txt-nifty.com/blog/2006/08/vcsal_26a1.html
0812デフォルトの名無しさん
2011/04/21(木) 15:42:48.61これより綺麗な可変長テンプレート関数書く方法ないのでしょうか
0813デフォルトの名無しさん
2011/04/21(木) 15:51:36.44可変個の引数関数
fnc("aaa","vvv"); と使う。
*#define fnc(...) fnc_(__VA_ARGS__,NULL)
int fnc_(char *p, ...){
va_list L;
va_start(L, p);
L = (char *)L - sizeof(char*);
char *ch;
while((ch=va_arg(L, char*))!=0)
printf("%s\n",ch);
va_end(L);
}
http://ameblo.jp/cpp-prg/entry-10151372280.html
0814デフォルトの名無しさん
2011/04/21(木) 18:39:12.58C++0xに対応したコンパイラを使えば、無駄なことをしなくてもそのまま使える。
0815デフォルトの名無しさん
2011/04/21(木) 21:10:58.19なんでわざわざそれ用に PP が用意してる ENUM_PARAMS とか ENUM_BINARY_PARAMS とか使わずに自前で書くの?
0816デフォルトの名無しさん
2011/04/22(金) 09:54:45.051から1億の連番ならどうすればいいですか?
省メモリで速度が速いのが良いです。
0817デフォルトの名無しさん
2011/04/22(金) 09:58:53.660818816
2011/04/22(金) 09:59:57.101から一億のうちの10%=1000万個程度が出現します。
配列を使う場合の容量はこうです。
8バイト * 一億個 / 2^20 = 763メガバイト。
0819デフォルトの名無しさん
2011/04/22(金) 10:09:03.03あー、速度も必要か。どういう速度が必要かによって、vector/deque/map/list好きなの使えばいいんでね?
0820デフォルトの名無しさん
2011/04/22(金) 10:18:11.78struct pair { int_least32_t key; int_least64_t value; };
std::vector<pair> v;
で、 v を常にソート済みに保つ。
sizeof(pair) は典型的には 16 バイトか 12 バイトになると思う。
その場合の容量はこう。
16バイト * 1000万個 / 2^20 = 153メガバイト。
ただしキーで参照するのは O(logN) で、追加削除は O(N) になってしまう。
(配列の場合はいずれも O(1) )
std::map にすれば追加削除も O(logN) に抑えられるけど、メモリ使用量は
たぶん数倍に増えてしまう。
0822デフォルトの名無しさん
2011/04/22(金) 12:00:40.250823デフォルトの名無しさん
2011/04/22(金) 12:29:59.27returntype func(){
return 1;
}
この関数の戻り値の型をイテレーターの型を指定しないでfunc<int>();見たいに呼び出す方法教えてください。
0824デフォルトの名無しさん
2011/04/22(金) 12:38:21.09それじゃ iterator の型が定まらないので無理。
0825デフォルトの名無しさん
2011/04/22(金) 12:48:08.940826デフォルトの名無しさん
2011/04/22(金) 12:50:11.000827デフォルトの名無しさん
2011/04/22(金) 13:07:53.49こうなると64bitEXEも実用的になってくるな
しかしCPU自体の速度はさほど向上してないし、STLはマルチコアに対応して
ないしでちょっと苦しいな
0828デフォルトの名無しさん
2011/04/22(金) 13:13:50.04第一引数にiteratorの引数を持ち、呼び出すときfunction<int>(iterator)と仮定すればなりたつだろ。
0829デフォルトの名無しさん
2011/04/22(金) 14:56:09.18自動で複数回ビルドして異なるEXE作る方法ありますか?
0830デフォルトの名無しさん
2011/04/22(金) 15:05:55.06/D (プリプロセッサの定義)
CL /DDEBUG TEST.C
次のコマンド ラインでは、最初のソース ファイルと同じ名前の実行可能ファイルが C:\BIN に生成されます。
CL /FeC:\BIN\ *.C
0831デフォルトの名無しさん
2011/04/23(土) 01:09:48.80しかし問題の>>823は明らかに第一引数にiteratorの引数を持ってないんだが。
0832デフォルトの名無しさん
2011/04/23(土) 02:46:50.50大文字で書かれるとすごい違和感。VMSとかCP/Mとか思い出しちゃう。
0833デフォルトの名無しさん
2011/04/23(土) 07:36:07.06既定のテンプレートの引数を関数テンプレートで使えるの?
func<int>() って第一のテンプレート型実引数イテレーター
の型を指定していることにならないの?
(ポイントがズレてたらごめん)
0834デフォルトの名無しさん
2011/04/23(土) 11:18:13.27中級者「C++全然わからんw」
上級者「C++全然わからんw」
標準化委員会「C++全然わからんw」
顧客「C++分かるよね?」
営業「もちろんです!!」
0835デフォルトの名無しさん
2011/04/23(土) 11:24:20.510836デフォルトの名無しさん
2011/04/23(土) 11:56:08.43初級者「C++全然わからんw」
中級者「C++全然わからんwwww」
上級者「C++全然わからんwwwwwwwwwポゲwwwwww」
標準化委員会「C++wwwww全wwwww然wwwwwwwwわwwwwかwwwらwwwんwwwwwwwwww」
0837デフォルトの名無しさん
2011/04/23(土) 12:22:34.25g++4.4.5では以下のソースはコンパイルできます。
#include <string>
int main(int argc, char *argv[]) {
std::string foo[argc+10];
}
VCでは配列確保に定数式が求められるため、コンパイルできません。
#include "stdafx.h"
#include <string>
int _tmain(int argc, _TCHAR* argv[]) {
std::string foo[argc+10];
}
これは、どちらの挙動がより標準に準拠しているのでしょうか?
0838デフォルトの名無しさん
2011/04/23(土) 12:27:34.190839デフォルトの名無しさん
2011/04/23(土) 12:38:15.76それgccの独自拡張だから
-ansiつけてコンパイルしてみな
0840デフォルトの名無しさん
2011/04/23(土) 12:41:14.57ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/gccextend.html
0841デフォルトの名無しさん
2011/04/23(土) 12:46:30.46ありがとうございます。
勉強になりました。
0842デフォルトの名無しさん
2011/04/23(土) 12:57:24.47・ メモリの占有量が小さい(これを一番重視)
・ 各ファイル(URL)は固有番号をもち、番号からパスを返す関数がある。
これはどのように実現したらいいですか。
0843デフォルトの名無しさん
2011/04/23(土) 13:44:54.01SQLiteでどう?
0844デフォルトの名無しさん
2011/04/23(土) 14:59:32.54ディレクトリ名だけ記録してツリー構造にしたらメモリ減らせると思うのですが。
しかしこれだと、ディスクへ記録するのと、逆引きの方法がわからないです。
0845デフォルトの名無しさん
2011/04/23(土) 15:09:44.80抽出したければ条件を指定すればいいだけだし、
いったい何が疑問なのかさっぱり分からない
0846デフォルトの名無しさん
2011/04/23(土) 15:15:03.19記録したいデータは何件くらい?
0847デフォルトの名無しさん
2011/04/23(土) 15:21:40.53俺はやっぱりSQLiteをおすすめするけど自分でやりたいなら
データ挿入の仕方はBツリーとかB+ツリーでググればソース見つかるはず
逆引きは文字列ハッシュ値保存すればできると思うけど
効率的な管理方法は俺には分からないわ・・・
0848デフォルトの名無しさん
2011/04/23(土) 15:28:57.62SQLiteでデータベース作って、サイズや速度に問題あったらまた聞きに来ます。
0849デフォルトの名無しさん
2011/04/23(土) 17:01:16.15stlport_std::hash_map
Insert Time: 8.859 sec. Search Time: 2.875 sec.
ページフォールト数: 11007 最大ワーキングセットサイズ: 42045.4KB
stlport_std::tr1::unordered_map
Insert Time: 9 sec. Search Time: 2.765 sec.
ページフォールト数: 11007 最大ワーキングセットサイズ: 42045.4KB
stlport_std::map
Insert Time: 12.265 sec. Search Time: 14.953 sec.
ページフォールト数: 11422 最大ワーキングセットサイズ: 46846.0KB
google::sparse_hash_map ver.1.10
Insert Time: 65.171 sec. Search Time: 11.563 sec.
ページフォールト数: 12004 最大ワーキングセットサイズ: 48631.8KB
google::dense_hash_map ver.1.10
Insert Time: 11.89 sec. Search Time: 5.906 sec.
ページフォールト数: 29674 最大ワーキングセットサイズ: 82579.5KB
stdext::hash_map
Insert Time: 10.109 sec. Search Time: 7.5 sec.
ページフォールト数: 13922 最大ワーキングセットサイズ: 56836.1KB
tr1::unordered_map
Insert Time: 11.796 sec. Search Time: 8.641 sec.
ページフォールト数: 13922 最大ワーキングセットサイズ: 56836.1KB
std::map
Insert Time: 14.078 sec. Search Time: 13.953 sec.
ページフォールト数: 14323 最大ワーキングセットサイズ: 58740.7KB
0850デフォルトの名無しさん
2011/04/23(土) 17:29:59.22stlport_std::hash_set
Insert Time: 7.812 sec. Search Time: 2.844 sec.
ページフォールト数: 11008 最大ワーキングセットサイズ: 42033.2KB
stlport_std::tr1::unordered_set
Insert Time: 7.515 sec. Search Time: 2.922 sec.
ページフォールト数: 11008 最大ワーキングセットサイズ: 42033.2KB
stlport_std::set
Insert Time: 9.89 sec. Search Time: 13.75 sec.
ページフォールト数: 10446 最大ワーキングセットサイズ: 42844.2KB
google::sparse_hash_set
Insert Time: 54.656 sec. Search Time: 10.859 sec.
ページフォールト数: 11428 最大ワーキングセットサイズ: 46583.8KB
google::dense_hash_set
Insert Time: 10.953 sec. Search Time: 5.922 sec.
ページフォールト数: 27480 最大ワーキングセットサイズ: 76283.9KB
stdext::hash_set
Insert Time: 9.984 sec. Search Time: 6.297 sec.
ページフォールト数: 13923 最大ワーキングセットサイズ: 56840.2KB
tr1::unordered_set
Insert Time: 15.218 sec. Search Time: 8.578 sec.
ページフォールト数: 13923 最大ワーキングセットサイズ: 56840.2KB
std::set
Insert Time: 11.484 sec. Search Time: 12.172 sec.
ページフォールト数: 14323 最大ワーキングセットサイズ: 58740.7KB
0851デフォルトの名無しさん
2011/04/23(土) 22:48:06.65データ型 配列名[][横方向の要素数] = { { [0][0]の初期値, [0][1]の初期値, ・・・ },
{ [1][0]の初期値, [1][1]の初期値, ・・・ },
{ [2][0]の初期値, [2][1]の初期値, ・・・ },
:
};
こういう配列の代入って初期化の時しかできないの?
もしそうだったら、初期化じゃなくてもこう代入する方法はない?
0852デフォルトの名無しさん
2011/04/23(土) 22:52:52.670853デフォルトの名無しさん
2011/04/23(土) 23:05:59.21初期化は代入じゃないぞ
0854デフォルトの名無しさん
2011/04/23(土) 23:28:16.85よくわからんがそうなのか
とりあえず宣言した時じゃなくて、その後に上記の様に代入する方法を知りたい
0855デフォルトの名無しさん
2011/04/23(土) 23:50:34.68そのように初期化した配列を用意し、目的の配列にコピーする。
0856デフォルトの名無しさん
2011/04/23(土) 23:52:18.27C#にはそういう書式があるが、C/C++にはない
C++0xには付くかもね
0857デフォルトの名無しさん
2011/04/24(日) 00:26:39.52thx
関数作るわ
0858デフォルトの名無しさん
2011/04/24(日) 01:22:49.93↓みたいに書いてもいいと思うよ。別に読みずらくないし大してカッコ悪くもない
配列名[0][0]=初期値; 配列名[0][1]=初期値;
配列名[1][0]=初期値; 配列名[1][1]=初期値;
0859デフォルトの名無しさん
2011/04/24(日) 10:13:32.76static int a[] = { 1,2,3,4,5 };
std::vector<int> v( a, a+sizeof(a)/sizeof(int) ); とか書くの煩わしい
0860デフォルトの名無しさん
2011/04/24(日) 11:34:12.42{
public:
typedef typename C::value_type value_type;
};
class B : public A< B >
{
public:
typedef unsigned int value_type;
};
これをVC++2010EEでコンパイルすると
error C2039: 'value_type' : 'B' のメンバーではありません。
とエラーになります。どうすればコンパイルが通るようになりますか?
0861デフォルトの名無しさん
2011/04/24(日) 12:00:33.96どれだけ無限に再帰させれば気が済むんだよ?
0862デフォルトの名無しさん
2011/04/24(日) 12:05:01.71void func() { B* a = new B; }
};
class B {
//なんたらかんたら
};
とするとBが定義されていないってエラーが出ます。前方宣言もだめでした。
この場合BをAの前に持って行きたくない時はどうすればいいですか?
0863デフォルトの名無しさん
2011/04/24(日) 12:25:19.450864デフォルトの名無しさん
2011/04/24(日) 12:32:20.56参照する必要がない場合だけで、インスタンス作っちゃうとアウト。
0865デフォルトの名無しさん
2011/04/24(日) 12:54:23.87class B の「宣言」をヘッダーでしてそれをインクルードしろ
これは定石
ついでにclass A もヘッダーで宣言しておけばよい
要するに宣言と定義を分ければOK
0866デフォルトの名無しさん
2011/04/24(日) 13:16:50.60// 略
std::sort(&hoge[0], &hoge[100]);
STLのsort等で、上のように普通の配列を使う事は可能ですか?
VC++で動作することは確認したのですが、保障されているんでしょうか。
0867デフォルトの名無しさん
2011/04/24(日) 13:20:40.84ポインタはランダムアクセスイテレータの要件を満たすので多分OKだと思う
0868デフォルトの名無しさん
2011/04/24(日) 13:22:01.640869デフォルトの名無しさん
2011/04/24(日) 13:25:50.25問題ない。
std::vector の &v[v.size()] はダメだけどね。
0870デフォルトの名無しさん
2011/04/24(日) 13:44:23.74std::sort(hoge,hoge+100);
個人的にのが好き
0871デフォルトの名無しさん
2011/04/24(日) 17:47:19.890873デフォルトの名無しさん
2011/04/24(日) 18:06:31.81だから、そうなる前にはじくんじゃん
0874デフォルトの名無しさん
2011/04/24(日) 18:36:20.27つまり無理
0875デフォルトの名無しさん
2011/04/24(日) 18:54:25.78依存関係にある型限定子 'B' に 'value_type' という名前のメンバー型がない
0876デフォルトの名無しさん
2011/04/24(日) 19:04:56.10その構図だけなら CRTP として良く使われる技法だけどね。
0877デフォルトの名無しさん
2011/04/24(日) 20:28:48.16宣言をヘッダーに置き、定義をソースファイルに置く事により無事解決しました。
ただ一つハテナ?と思う事がありました。
コンストラクタ内でnewしてしまうと、永久再帰に飛び込んでしまい、スタックオーバーフロー
で落ちます。それでinit()という別の初期化メンバ関数を作ったのですがどうにも不格好です。
#ifndef CLASS1_H
#define CLASS1_H
class B;
class A {
B* b;
public:
A();
void init();
void print() const;
void print2() const;
~A();
};
class B {
A* a;
public:
B();
void init();
void print() const;
void print2() const;
~B();
};
#endif
0878デフォルトの名無しさん
2011/04/24(日) 20:29:31.03#include "class1.h"
A::A() : b(0) {}
void A::init() { b = new B; }
void A::print() const {
std::cout << "This is class A." << std::endl;
}
void A::print2() const {
b->print();
}
A::~A() { delete b; }
B::B() : a(0) {}
void B::init() { a = new A; }
void B::print() const {
std::cout << "This is class B." << std::endl;
}
void B::print2() const {
a->print();
}
B::~B() { delete a; }
int main()
{
A a;
B b;
a.init(); // コンストラクタに入れると永久ループになりスタックオーバーフローする
b.init(); // 同上
a.print();
b.print();
a.print2();
b.print2();
}
0879デフォルトの名無しさん
2011/04/24(日) 20:31:22.24するスマートな方法はないでしょうか?
0880デフォルトの名無しさん
2011/04/24(日) 20:49:52.62元からAとBを合わせたほうがすっきりするような気がするけど…
0881デフォルトの名無しさん
2011/04/24(日) 20:51:54.010882デフォルトの名無しさん
2011/04/24(日) 21:15:39.45やっぱりそうですね。
>>881
コンポジションですね。これでようやくコンポジションの使い方が分かりました。
うっかり継承を使って問題を複雑にする所でした。
0883デフォルトの名無しさん
2011/04/24(日) 21:29:39.60A、Bに引数付きのコンストラクタ作っって、
デフォルトコンストラクタからnewするときにthisを渡せばいいんじゃないの?
そもそも、再起がどうでコンパイルエラーをなくす事に気を取られて、
自分の動かそうとしているコードの意味を理解していないんじゃないか?
あと、相互参照してるときにデストラクタで相手を保持してるポインタを直接deleteすると、実行時に死ぬよ。
0884デフォルトの名無しさん
2011/04/24(日) 21:32:35.60今回はコンポジションが最適なようです。
プログラムを組み直します。
>そもそも、再起がどうでコンパイルエラーをなくす事に気を取られて、
>自分の動かそうとしているコードの意味を理解していないんじゃないか?
確かにご指摘の通りでした。
相互参照はしてないので、この場合は大丈夫なのかな?
0885デフォルトの名無しさん
2011/04/24(日) 21:39:43.54循環参照の環が切れなくなってリソースが解放出来なくなるトラブルを
防ぐためでしたね。
頭で理解しているのと、実際にプログラムを組んでみるのとではかなり
差があります。こういう差を持っているとデバッグの時に苦しみそうです。
0886デフォルトの名無しさん
2011/04/29(金) 17:51:43.32if(a==b)
funcA();
else
funcB();
これを少しでも高速にする方法ってありますかね
xorのほうが速かったりしますかね?
0887デフォルトの名無しさん
2011/04/29(金) 18:06:48.35本当にそんな箇所がボトルネックなのか?
もっと他に高速化すべき箇所があるんじゃないか?
0888デフォルトの名無しさん
2011/04/29(金) 18:11:25.640889デフォルトの名無しさん
2011/04/29(金) 18:32:04.460890886
2011/04/29(金) 18:38:14.98一回一回はそれなりに軽快なんだけども、この分岐を相当数経由するので・・・
今後のためにも、boolの高速な比較方法を教えていただきたい
0891デフォルトの名無しさん
2011/04/29(金) 18:50:42.80void (*func)() = funcB;
if(a==b) func = funcA;
func();
または
func = a==b ? funcA : funcB;
func();
elseない分ちょっと速いかも。
あとは邪道かもしれんが配列にして
void (*func[])() = {funcB, funcA};
func[a==b]();
くらいかな
0892デフォルトの名無しさん
2011/04/29(金) 19:04:23.24関数ポインタか、なるほど。試してみます。
全部のヤツで「a==b」を使って比較しているようですが、
==が一番高速ってことなのでしょうか。
個人的にはa^b(exor,ビット演算)のほうが速いと思っていたのですが。
0893デフォルトの名無しさん
2011/04/29(金) 19:09:32.080894デフォルトの名無しさん
2011/04/29(金) 19:16:26.95心配ならいろんなところググって調べろ
0895デフォルトの名無しさん
2011/04/29(金) 19:20:39.430896デフォルトの名無しさん
2011/04/29(金) 19:50:19.350897デフォルトの名無しさん
2011/04/29(金) 19:55:09.710898デフォルトの名無しさん
2011/04/29(金) 20:18:58.26if(a == b)の場合
> movzbl -1(%ebp), %edx
> movzbl -2(%ebp), %eax
> cmpl %eax, %edx
> jne L11
if(a ^ b)の場合
> movzbl -1(%ebp), %edx
> movzbl -2(%ebp), %eax
> cmpl %eax, %edx
> je L11
g++で比較してみたけど、マシン語レベルではどっちもほぼ同じだよ。
0899デフォルトの名無しさん
2011/04/29(金) 20:27:06.39比較結果のフラグレジスタの値を返すだけ
分かっていない奴は最低限アセンブラぐらいやってから語れよ
0900デフォルトの名無しさん
2011/04/29(金) 20:41:12.49フラグレジスタを使って「ジャンプ(≒分岐)」する、と俺は習ったが。
そもそも==が分岐とは誰も言ってないぞ・・・
書き込み読んでから、な。
要は、殆ど無駄な努力。
0902デフォルトの名無しさん
2011/04/29(金) 20:46:46.61結果が返されるだけでジャンプや分岐とは無関係。
0903デフォルトの名無しさん
2011/04/29(金) 20:50:04.770904892
2011/04/29(金) 20:54:19.26わざわざありがとうございます。
これで安心して先に進めます。
関数ポインタ使ったら処理時間が短くなりました。
皆さんありがとうございました。
0905デフォルトの名無しさん
2011/04/29(金) 21:31:10.28最後になんのプログラムなのか教えて
気になるよ・・・
0906デフォルトの名無しさん
2011/04/29(金) 21:37:20.07C++の仮想関数のコストが騒がれたのも同様の理由による
パイプラインが深い今のCPUにとってはかなりの重荷
0907デフォルトの名無しさん
2011/04/29(金) 21:39:45.620908デフォルトの名無しさん
2011/04/29(金) 21:41:49.09分岐予測など効かず、速度を出す場面で使うべきで無い。
コンパイラ、CPUにもよるが、単なる関数呼び出しやGOTOよりも遅い。
0909デフォルトの名無しさん
2011/04/29(金) 21:47:09.030910デフォルトの名無しさん
2011/04/29(金) 21:51:57.40画像処理系のプログラムです。
お世話になりました。
>>909
はい、関数ポインタも含めていろいろといじくったら、ベンチの結果が改善しました。
逆に悪化したところもあると思うので、そこらへんは明日やろうと思います。
皆さん本当にありがとうございました。
0911デフォルトの名無しさん
2011/04/29(金) 22:02:53.21分岐が大量にあったり多岐にわたるコードなら、関数ポインタもいまだ有効とは聞くが。
分岐予測だのあまり過信せず、パフォーマンスを一々計ったほうがよさそうかな?
0912デフォルトの名無しさん
2011/04/29(金) 22:03:52.550913デフォルトの名無しさん
2011/04/29(金) 22:03:54.730914デフォルトの名無しさん
2011/04/29(金) 22:04:03.66たしか飛び先が前回と同じなら大丈夫だったと思うよ
まぁ何のために関数ポインタって飛び先が変わるためだろうからあんまり意味ないんだろうけど
0915デフォルトの名無しさん
2011/04/29(金) 22:04:23.26if文で関数呼び出したときは、インライン展開される可能性はある。
スイッチ文もあまりはやくならない。
if文で確定しやすい順に判定するのが一番。
0916デフォルトの名無しさん
2011/04/29(金) 22:05:51.53> func = a==b ? funcA : funcB;
> func();
>
> elseない分ちょっと速いかも。
これはelse無いと判断していいんだろうか。
0917デフォルトの名無しさん
2011/04/29(金) 22:06:56.371%、1%、1%、1%、・・・、10%、60%とすると無駄な判定が増える。
0918デフォルトの名無しさん
2011/04/29(金) 22:10:04.95でもインラインが必ずしも速くなるわけじゃないからな
キャッシュミス起こしたり変数大量にあるとレジスタ足りなくなったり
ってWikiにあったぞ
0919デフォルトの名無しさん
2011/04/29(金) 22:14:12.260920デフォルトの名無しさん
2011/04/29(金) 22:15:09.05実測に重きを置くのは賛同だけど基本的に>>887でFA
組み込み向けで特定の(たった一つの)機種のために最適化するなら何でもありだけど、
ある程度動作対象マシンに幅のある汎用プログラム書いてるならバイナリレベルの最適化は時間の無駄だと思う。
0921デフォルトの名無しさん
2011/04/29(金) 22:16:41.610922デフォルトの名無しさん
2011/04/29(金) 22:22:56.250923デフォルトの名無しさん
2011/04/29(金) 22:38:55.78相手が満足するかは二の次と言う意味では、素人童貞は童貞と一緒と言うことだ。
0924デフォルトの名無しさん
2011/04/30(土) 01:05:30.250925デフォルトの名無しさん
2011/04/30(土) 23:46:46.75またプログラミングっぽいことがしたいなと思い始めてきました
C++はプログラム言語の中でも取得が難しいとか聞きますが、
ほぼ未経験の状態で勉強を始めるのは無謀でしょうか
0926デフォルトの名無しさん
2011/04/30(土) 23:50:18.59クラスは必要なら使えばいい。でもテンプレート関係は使うとかなり楽しいよ。
0927デフォルトの名無しさん
2011/04/30(土) 23:50:20.420928デフォルトの名無しさん
2011/05/01(日) 00:00:46.430929デフォルトの名無しさん
2011/05/01(日) 00:03:08.810930デフォルトの名無しさん
2011/05/01(日) 00:12:18.740931デフォルトの名無しさん
2011/05/01(日) 00:20:24.08いきなりCプラプラはまず無理だからPerlとか人気で楽で使える言語先にやって慣れてからにしたほうがいいよ
0932デフォルトの名無しさん
2011/05/01(日) 00:22:31.87自分に関連するコードの差分チェックすらしない人なの?
0933デフォルトの名無しさん
2011/05/01(日) 00:59:23.28最終的に何を作りたいかで、言語は選ぶのがいいと思うよ
特にやりたい事が楽にできるライブラリがあるかは、結構ポイントだと思う
C++は気に食わない所があったら、直せなければ気が済まないような人に向いてるかなw
今ならC#とか結構いいんじゃないか
.net入ってるなら、コンパイラも入っている筈だし
0934デフォルトの名無しさん
2011/05/01(日) 01:05:44.740935デフォルトの名無しさん
2011/05/01(日) 16:43:27.43ITドカタの場合はコンペータとしかコミュできないからしょうがないよな
ドカタは人とのコミュであさっての方向レスをシャキーーンとするからな
0936デフォルトの名無しさん
2011/05/01(日) 16:45:02.530937デフォルトの名無しさん
2011/05/01(日) 16:57:51.530938デフォルトの名無しさん
2011/05/01(日) 17:36:05.880939デフォルトの名無しさん
2011/05/01(日) 17:58:27.030940デフォルトの名無しさん
2011/05/01(日) 18:46:22.57モジュールを作れるようになったら、もう中級レベルを名乗ってOkですか?
C++初めて3ヶ月位ですが、何か目標みたいなのを探しています。
0941デフォルトの名無しさん
2011/05/01(日) 18:53:45.73デザインパターンとか初級者レベルだべ
0942デフォルトの名無しさん
2011/05/01(日) 18:56:47.050943デフォルトの名無しさん
2011/05/01(日) 19:04:14.84boostのラムダあたりが実装できるレベルが中級
0944デフォルトの名無しさん
2011/05/01(日) 19:08:21.94これをパッと的確に答えられると中級者らしい
>「boost::shared_ptr の実装は非常に非効率で,私はあれはポリシー化すべきだと思うのですが,これについてあなたはどう思いますか?」
>「boost::shared_ptr か boost::intrusive_ptr かのどちらかを人に勧める場合,デフォルトではどちらが良いと思いますか? 理由を添えてお答えください.」
>「boost::weak_ptr の有効な使い方を1つ挙げてみてください.」
0945デフォルトの名無しさん
2011/05/01(日) 19:26:03.930946デフォルトの名無しさん
2011/05/01(日) 19:31:19.200947デフォルトの名無しさん
2011/05/01(日) 19:36:27.63本買ってもC++0xに準拠してない。STLとかがらっと変わるだろうし
早いとこ仕様固まって欲しい。
0948デフォルトの名無しさん
2011/05/01(日) 19:37:06.26boost そのものは使わない・使えなくても
0949デフォルトの名無しさん
2011/05/01(日) 19:44:24.33とりあえず上の三冊を揃えて、勉強します
どうせGW何もすることないし
0950デフォルトの名無しさん
2011/05/01(日) 19:46:45.910951デフォルトの名無しさん
2011/05/01(日) 20:35:08.16なんでやねん
0952デフォルトの名無しさん
2011/05/01(日) 20:42:53.64なんでら
0953デフォルトの名無しさん
2011/05/01(日) 20:52:01.74コピーコンストラクタと代入演算子はちげーし。
0954デフォルトの名無しさん
2011/05/01(日) 21:12:50.730955デフォルトの名無しさん
2011/05/01(日) 21:20:20.600956デフォルトの名無しさん
2011/05/01(日) 21:25:08.85コピーコンストラクタですらない件について
http://codepad.org/HeOxk10g
0957デフォルトの名無しさん
2011/05/01(日) 21:42:38.93いつまでたっても上級者と名乗る自信をもつことはないのだから。
0958デフォルトの名無しさん
2011/05/01(日) 22:31:34.96多くのレスをどうも有難うございます
一応アクションゲームっぽいのが作ってみたいかな…と思って調べると
やっぱりCとかC++が有用そうで、こちらで質問させて頂いた次第です
なんとかなるというお話と無理というお話で解れているみたいなのでちょっと迷いますが、
とりあえず少し弄ってみて、無理そうだったらC#でも改めて調べてみる事にします
0959デフォルトの名無しさん
2011/05/01(日) 22:45:02.04速度とか複雑な描画とかが必要になったらそのときにはDirectX関連かOpenGL関連にすすむといい。
0960デフォルトの名無しさん
2011/05/01(日) 22:45:21.57じゃあ何だというのです
エラーになる理由が見当たらない
0961デフォルトの名無しさん
2011/05/01(日) 22:45:41.840962デフォルトの名無しさん
2011/05/01(日) 22:46:49.260963デフォルトの名無しさん
2011/05/01(日) 22:47:09.670964デフォルトの名無しさん
2011/05/01(日) 22:49:45.98プログラムの意味的にはそこでコピーコンストラクタを要求するが、
コンパイル結果としてコピーコンストラクタを呼び出す必要は無い、
という少し特殊な状況です。
0965デフォルトの名無しさん
2011/05/01(日) 22:58:20.54テンポラリのconst参照による束縛は仕様的にはコピーだったということですか?
だから普段は最適化でコピーは呼ばれないように錯覚してたけど
今回はシグネチャレベルで弾かれて驚いたと
0966デフォルトの名無しさん
2011/05/01(日) 23:06:34.51const参照による束縛は関係ありません。
初期化の構文と、その解釈と、その後の最適化の話です。
0967デフォルトの名無しさん
2011/05/02(月) 07:44:25.40これのことかな?
「コンストラクタに無名のインスタンスが渡されたらコピーコンストラクタは呼ばれない」
0968デフォルトの名無しさん
2011/05/02(月) 09:04:22.61If the initializer expression is an rvalue, with T2 a class type, and “cv1 T1” is
reference-compatible with “cv2 T2,” the reference is bound in one of the
following ways (the choice is implementation-defined): <--- コピーされるかどうかは実装依存
- The reference is bound to the object represented by the rvalue (see 3.10) or
to a sub-object within that object.
- A temporary of type “cv1 T2” is created, and a constructor is called to
copy the entire rvalue object into the temporary. The reference is bound to
the temporary or to a sub-object within the temporary.
The constructor that would be used to make the copy shall be callable whether
or not the copy is actually done. <--- コピーされようがされまいが、コピー可能でなければならない
エラーになるのはこのためとおもわれ
0969デフォルトの名無しさん
2011/05/02(月) 09:05:57.650970デフォルトの名無しさん
2011/05/02(月) 12:03:51.48カコイイ。
0971デフォルトの名無しさん
2011/05/02(月) 13:56:34.46どういうときに使いますか
0972デフォルトの名無しさん
2011/05/02(月) 14:08:17.178.5.3 は参照の初期化だからこの流れとは違うね。
8.5 p14 にある "If the destination type is a (possibly cv-qualified) class type:" の
↓ここが該当する。
> If the initialization is direct-initialization, or if it is copy-initialization where the
> cv-unqualified version of the source type is the same class as, or a derived class of,
> the class of the destination, constructors are considered. ...
この場合のコピーコンストラクタの省略については 12.8 p14,15 にある。
0973デフォルトの名無しさん
2011/05/02(月) 14:29:12.57- If the destination type is a reference type, see 8.5.3. とあるけど
参照の話ではないの?
0975デフォルトの名無しさん
2011/05/02(月) 22:07:52.23ほかで宣言されたグローバル変数を使いたいとき
色んなライブラリで結構使われてませんか?
0976デフォルトの名無しさん
2011/05/02(月) 22:13:39.34よく使いますか?
0977デフォルトの名無しさん
2011/05/02(月) 22:51:28.43C++では使う必要性が殆どないな
0978デフォルトの名無しさん
2011/05/02(月) 23:00:21.25includeすれば使えるんじゃないの?
C++から始めたからか、よく分からん
0979デフォルトの名無しさん
2011/05/02(月) 23:01:04.580980デフォルトの名無しさん
2011/05/02(月) 23:04:50.67extern int manko;
こうやって他人に嫌がらせするのに使う。
0981デフォルトの名無しさん
2011/05/02(月) 23:07:47.510982デフォルトの名無しさん
2011/05/02(月) 23:11:05.091:構造体を99個作ってcharメンバを5つ持つ
2:コンテナ<コンテナ<char>>にして持つ
0983デフォルトの名無しさん
2011/05/02(月) 23:24:50.63だね
0984デフォルトの名無しさん
2011/05/02(月) 23:32:28.12効率なんてどうでもいいと思うが
0985デフォルトの名無しさん
2011/05/02(月) 23:33:48.48ですよねー
なぜあの時構造体が思いつかなかったのか・・・
何故コンテナで持つことを考え付いてしまったのか
0986デフォルトの名無しさん
2011/05/02(月) 23:34:37.330987デフォルトの名無しさん
2011/05/03(火) 00:05:48.830988デフォルトの名無しさん
2011/05/03(火) 03:41:56.800989デフォルトの名無しさん
2011/05/03(火) 05:22:58.51std::map<std::string, char> hoge[99];
hoge[0].insert(StringCharPair("A", '0'));
hoge[0].insert(StringCharPair("B", '1'));
hoge[0].insert(StringCharPair("C", '2'));
hoge[0].insert(StringCharPair("D", '3'));
hoge[0].insert(StringCharPair("E", '4'));
0990デフォルトの名無しさん
2011/05/03(火) 05:46:36.42class Base
{
protected:
int hoge;
};
class Derived
{
public:
void f(Base * pBase) {
... pBase->hoge ... // エラー
}
void f(Derived * pDerived) {
... pDerived->hoge ... // 問題ない
}
};
0991デフォルトの名無しさん
2011/05/03(火) 05:48:27.320992デフォルトの名無しさん
2011/05/03(火) 05:50:52.46>>988は int cur_count, count_limit, thread_id; をint num[3]; とか書くバカ。
>>989は int cur_count, count_limit, thread_id; をpair<string, int> num; とか書くバカ。
>>990は #define private publicとか書くバカ。
こういう奴らが他人が読めない糞コードを量産する。
0993デフォルトの名無しさん
2011/05/03(火) 05:56:45.87それじゃprivateも見えちゃうじゃん!!
>>992
ネタにマ(ry
0994デフォルトの名無しさん
2011/05/03(火) 06:12:14.23知れないのにDerivedに見せるのはおかしい。
実体がDerivedとわかってるなら、
derived *pd = dynamic_cast<derived *>(pb);
実体がDerivedじゃなくても公開したいなら、Baseに
static int &get_hoge(base *pb) { return pb->hoge; }
でも作るのかなあ。
0995デフォルトの名無しさん
2011/05/03(火) 06:24:54.54だけど必要になってしまったんだ
> 実体がDerivedじゃなくても公開したいなら、Baseに
> static int &get_hoge(base *pb) { return pb->hoge; }
> でも作るのかなあ。
なるほど、これで回避できるのか・・・
0996デフォルトの名無しさん
2011/05/03(火) 07:49:24.68なんで Derived って名前で Base を継承してないの?
0997デフォルトの名無しさん
2011/05/03(火) 08:05:08.810998デフォルトの名無しさん
2011/05/03(火) 08:21:56.71書き忘れてただけ
誤: class Derived
正: class Derived : public Base
0999デフォルトの名無しさん
2011/05/03(火) 11:14:14.46キャッシュ効率を考えてあえてバラして配列にすることはあるでしょ
1000デフォルトの名無しさん
2011/05/03(火) 12:48:54.2610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。