| ²é¿´: 1877 | »Ø¸´: 5 | |||
cfem_nliгæ (³õÈëÎÄ̳)
|
[½»Á÷]
¡¾·ÖÏí¡¿ÔÚ´óµÄÏîÄ¿ÖÐΪʲô²»ÓÃc++[Ҳ˳±ã²âÊÔÒ»ÏÂÄãµÄc++»ù±¾Ë®Æ½] ÒÑÓÐ4È˲ÎÓë
|
|
ÓïÑÔÖ®ÕùÀúÀ´ÓÐÖ®,¿ÉνÊǾ¾Ã²»Ï¢. ´óһͳµÄÔÔòÔÚÕâÀï²¢²»ÊÊÓÃ. ¶ÔÓÚ¿ÆÑ§¼ÆËã, ºÜ¶àÈËÒ»Ö±ÔÚΪc++×öÐû´«,ΪÆä·Éí. ¿ÉÊÇc++±¾ÉíµÄȱµãÒ²ÊÇÏÔ¶øÒ×¼ûµÄ,Ì«¹ýÓÚ¸´ÔÓ,Ò»¸öÓÅÐãµÄc++³ÌÐòԱʵÔÚÊDz»ºÃÕÒ. ×ªÔØÒ»ÆªºÜ¾ÃÒÔǰ¿´µ½µÄÎÄÕÂ, ´ÓµçÄÔÀï·³öÀ´,ÍüÁ˳ö´¦ÁË, ÄÄλҪÊÇÖªµÀÂé·³¹ã¶ø¸æÖ®. ¿´×ÅÆªÎÄÕÂ,Ҳ˳±ã²âÊÔÒ»ÏÂÄãµÄc++»ù±¾Ë®Æ½. ÕâÊÇÓ¢ÎÄÔÎÄ,ºóÃæ¸½´øÁËÁ´½Ó,¿ÉÒÔÏÂÔØ.ûÓÐʱ¼ä×öÊʵ±µÄ·Òë,Èç¹ûÄÄλÈÊÐÖʵÔÚÓдËÐèÒªµÄ»°,ÎÒÔÙ¾¡Á¿ÕÒʱ¼ä²¹ÉÏ;ÒªÊÇÓÐÈËÄܹ»·ÒëÁË,ÔÚÕâÀïÏÈÐÐл¹ýÁË. Why I Dislike C++ For Large Projects By Mark Roulo My primary complaint against C++ is that the language is so complicated, and has enough booby-traps, that average and above-average programmers have a difficult time writing code without serious bugs. In a large program with raw pointers, the quality of the program will largely be driven by the least talented members of the team. This makes it highly dangerous to select a language that requires all the programmers to be in, say, the top 25% of the talent pool. Given a team with 10 developers (and my projects typically have more like 40-50), this seems to be asking for lots of long term trouble. Things become even more unstable when one considers that the average turnover of software developers in Silicon Valley (where I live and work) is something like 20-25% and that many large projects also use contractors. The total number of programmers on a project will be much higher than the average (or even the peak) number of developers on the project. I have worked on a project with both C++ and Java components (roughly 50% each) that communicate via CORBA. Part of my job has been to interview candidates for both halves of the project over a period of several years. This has given me a fair amount of exposure to the C++ developer pool. As part of my standard interview for C++ candidates I ask them to write me a small class with the intention of evaluating their command of the language. This also gives us a reasonable coding sample to discuss during the interview. I can ask about potential improvements, extensions and testing strategies. Most of the candidates I interview have already made it to the top of the resume pool -- usually by claiming at least 3 years professional experience with C++. Since many resumes have this, the candidates tend to have some other plus: large systems experience, degree from a good school, personal recommendation, etc. The candidates then must survive a phone screen interview whose job is to weed out candidates that can't, for example, describe any of their projects coherently. My request is to: Write a Named Point class with three members: two floating point values for the coordinates on an X-Y plane, and a name represented as a 'char *'. Assume that this class will be used for some sort of wargame or simulation program that treats the world as flat and that these named points will be used to represent things like cities, battlefields, etc. A typical first try looks something like this: class NamedPoint { private: float x; float y; char *name; public: NamedPoint (float x, float y, char *name) { this->x = x; this->y = y; this->name = name; } float getX() {return x;} float getY() {return y;} char *getName() {return name;} void setX(float x) {this->x = x;} void setY(float y) {this->y = y;} void setName(char *name) {this->name = name;} }; There are several problems with this code: • name has its encapsulation violated with the getName() method. • The code calling the constructor is responsible for managing the scope of the member variable 'name'. This code fragment shows the problem: • // Ignore for now a lot of awfulness in this function ... • // this should probably be a constructor in a sub-class • // of NamedPoint, 'cityName' and 'countryName' should be • // checked for NULL _and_ for length so that sprintf() • // doesn't overrun temp ... • // • // The point is that if NamedPoint doesn't *own* its own • // 'name' value, the clients are at risk of memory corruption. • // • NamedPoint makeCityCoordinate (float x, float y, char *cityName, char *countryName) • { • char temp[80]; • sprintf (temp, "City: %s, Country: %s", cityName, countryName); • • return NamedPoint (x, y, temp); • } After I point out these problems, a typical fix is to modify NamedPoint to look like this (changes in bold): class NamedPoint { private: float x; float y; char *name; public: NamedPoint (float x, float y, char *name) { this->x = x; this->y = y; this->name = new char[strlen(name) + 1]; strcpy (this->name, name); } float getX() {return x;} float getY() {return y;} const char *getName() {return name;} void setX(float x) {this->x = x;} void setY(float y) {this->y = y;} void setName(char *name) {this->name = new char[strlen(name) + 1]; strcpy (this->name, name);} }; This trades in one set of bugs for another. The new version has the following problems: • It doesn't have a destructor, so it leaks memory. • setName() doesn't delete name, so it leaks more memory if setName() is called. • strlen(NULL) and strcpy(NULL) are bad. Usually, a program will crash if this is attempted, so we really should check for NULL. After I point this out, I usually get a third try that looks like this: class NamedPoint { private: float x; float y; char *name; public: NamedPoint (float x, float y, char *name) { this->x = x; this->y = y; if (name == NULL) this->name = NULL; else { this->name = new char[strlen(name) + 1]; strcpy (this->name, name); } } ~NamedPoint () { if (name != NULL) delete name; } float getX() {return x;} float getY() {return y;} const char *getName() {return name;} void setX(float x) {this->x = x;} void setY(float y) {this->y = y;} void setName(char *name) {if (this->name != NULL) delete this->name; if (name == NULL) this->name = NULL; else { this->name = new char[strlen(name) + 1]; strcpy (this->name, name); }} }; Things are slowly improving ... in the sense that the bugs are getting more and more subtle. It is also worth mentioning that over half of the candidates don't assign NULL to name if the input 'name' value is NULL, leaving the memory uninitialized. This really isn't a C++ issue. Failing to initialize pointers in C structs is equally bad. The new problems are: • NamedPoint allocates with 'new[]' but deletes with 'delete'. This may or may not work depending on the compiler. It seems to work fine for most current compilers, so I rarely comment on this. Still, it is incorrect. • Testing for NULL before calling delete is unnecessary (since 'delete 0' is defined to be harmless), but causes no damage other than slowing down the program slightly. • NamedPoint now trashes the heap if any NamedPoint objects are passed by value (like, for example, returning a NamedPoint object from a function). This is because the copy constructor that C++ gives us for free copies the 'name' pointer, but does not copy the contents. Now, calling the destructor on the first shared 'name' returns the memory to the heap (although the second copy will continue to use it, EVEN IF THE MEMORY GETS ALLOCATED TO SOME OTHER USE). Calling the destructor on the second shared 'name' probably corrupts the heap by deleting memory that was not, at that time, allocated (the second delete isn't required to corrupt the heap, but this is how most C++ heap managers work). • It has similar problems with the default assignment operator. After pointing out the copy constructor and assignment operator problems, the fourth try usually looks like the code below. But not always. Sometimes I need to explain to the candidates what a copy constructor and assignment operator are. Some candidates have strange beliefs about when you need to implement them. One candidate, for example, believed that copy constructors were needed for classes above some size threshold, but not needed for classes below that size threshold. I'll emphasise that I'm interviewing candidates with several years C++ experience who have already passes a phone screen. In any event, typical attempt number four: class NamedPoint { private: float x; float y; char *name; public: NamedPoint (float x, float y, char *name) { this->x = x; this->y = y; if (name == NULL) this->name = NULL; else { this->name = new char[strlen(name) + 1]; strcpy (this->name, name); } } ~NamedPoint () { if (name != NULL) delete name; } // NOTE: Most interviewees start with a signature // like this: // NamedPoint (NamedPoint copy) // NamedPoint (const NamedPoint & copy) { this->x = copy.x; this->y = copy.y; if (copy.name != NULL) { this->name = new char[strlen (copy.name) + 1]; strcpy (this->name, copy.name); } } NamedPoint & operator=(const NamedPoint & copy) { this->x = copy.x; this->y = copy.y; if (this->name != NULL) delete this->name; if (copy.name != NULL) { this->name = new char[strlen (copy.name) + 1]; strcpy (this->name, copy.name); } // Note that we haven't nulled out this->name, so // we can get a double-delete problem... } float getX() {return x;} float getY() {return y;} const char *getName() {return name;} void setX(float x) {this->x = x;} void setY(float y) {this->y = y;} void setName(char *name) {if (this->name != NULL) delete this->name; if (name == NULL) this->name = NULL; else { this->name = new char[strlen(name) + 1]; strcpy (this->name, name); }} }; This is almost correct! The big problems remaining are that the assignment operator doesn't check for assignment to itself, the copy constructor only partially copies if 'copy' has NULL for its name, and we still risk a double-delete via the assignment operator. If a program does try to assign one of these objects to itself, the object deletes its own 'name' value before attempting to copy it onto itself. I usually stop here (assuming we get this far). Conclusion Empirically, I have found it very difficult to find even experienced C++ programmers capable of correctly writing a simple C++ class containing a pointer. Since pointers are, because of the C legacy, an important part of the language, this is a fatal flaw for large projects that need to work. Summarizing the mistakes in my fairly trivial problem: • Pointer assignment (a C legacy) makes it too easy to corrupt the stack and heap. The initial solution allows the stack to be accessed after it has gone out of scope. Corrected versions often allow for double deletes of heap allocated storage or accessing already deleted heap storage or both. • The default copy constructor and assignment operator are too often wrong. But you get them unless you explicitly take action. The language default being fatally wrong is a big problem. • delete and delete[] are similar, but possibly different. • NULL is legal for many pointer values, but the behavior tends to be undefined (delete being one nice exception). Since the NULL case is frequently overlooked, memory corruption again seems to be designed in to large systems. One solution is to do a lot more stuff with things like STL string objects and generally try to hide the heap allocation. The auto_ptr<> and similar classes help here, too. But they only help. The fundamental problem still remains -- it is too easy to write subtly wrong code and the language is littered with booby-traps. Larger programs encounter even more tricky problems. Scott Meyers has written two book on the subject of not getting killed by the C++ language. My point, though, is that most experienced C++ programmers I have interviewed can't get a simple class correct, even after multiple tries. Enough said. It makes me unwilling to risk a large project with the language. http://dl.dropbox.com/u/1982439/CAE%20software%20development/Programming/Language%20arguments/Why%20I%20Dislike%20C%2B%2B%20For%20Large%20Projects.doc |
» ²ÂÄãϲ»¶
071000ÉúÎïѧµ÷¼Á
ÒѾÓÐ3È˻ظ´
085600²ÄÁÏÓ뻯¹¤301·ÖÇóµ÷¼ÁԺУ
ÒѾÓÐ5È˻ظ´
081700£¬311£¬Çóµ÷¼Á
ÒѾÓÐ15È˻ظ´
Ò»Ö¾Ô¸±±¾©»¯¹¤085600 310·ÖÇóµ÷¼Á
ÒѾÓÐ18È˻ظ´
²ÄÁÏÓ뻯¹¤371Çóµ÷¼Á
ÒѾÓÐ14È˻ظ´
336²ÄÁÏÓ뻯¹¤085600Çóµ÷¼Á
ÒѾÓÐ7È˻ظ´
²ÄÁÏ334Çóµ÷¼Á
ÒѾÓÐ18È˻ظ´
331Çóµ÷¼Á
ÒѾÓÐ8È˻ظ´
332Çóµ÷¼Á
ÒѾÓÐ17È˻ظ´
Ò»Ö¾Ô¸ÄϾ©º½¿Õº½Ìì´óѧ ²ÄÁÏÓ뻯¹¤329·ÖÇóµ÷¼Á
ÒѾÓÐ4È˻ظ´
» ±¾Ö÷ÌâÏà¹Ø¼ÛÖµÌùÍÆ¼ö£¬¶ÔÄúͬÑùÓаïÖú:
Ïë³ö¹ú¶ÁÑУ¬Ñ°ÕÒÒâ¼û£¬ÇëÇóÖ¸½Ì£¡£¡£¡
ÒѾÓÐ7È˻ظ´
¹þ¶û±õ¹¤Òµ´óѧ¼ÆËã»ú¿ÆÑ§Óë¼¼ÊõѧԺ½ÌʦÕÐÆ¸ÆôÊÂ
ÒѾÓÐ3È˻ظ´

magic7004
½ð³æ (Ö°Òµ×÷¼Ò)
- ³ÌÐòÇ¿Ìû: 2
- Ó¦Öú: 0 (Ó×¶ùÔ°)
- ½ð±Ò: 444
- ºì»¨: 4
- Ìû×Ó: 3278
- ÔÚÏß: 156.2Сʱ
- ³æºÅ: 482895
- ×¢²á: 2007-12-26
- ÐÔ±ð: GG
- רҵ: »¯Ñ§¹¤³Ì
¡ï ¡ï
Сľ³æ(½ð±Ò+0.5):¸ø¸öºì°ü£¬Ð»Ð»»ØÌû½»Á÷
resonant(½ð±Ò+1):»¶Ó²ÎÓ룺-£© 2010-08-10 21:12:12
Сľ³æ(½ð±Ò+0.5):¸ø¸öºì°ü£¬Ð»Ð»»ØÌû½»Á÷
resonant(½ð±Ò+1):»¶Ó²ÎÓ룺-£© 2010-08-10 21:12:12
| ÔΣ¬ÕâЩ¶¼ÊÇC++µÄ»ù´¡°É¡£Ö¸Õë³õʼ»¯£¬¿½±´¹¹Ô캯Êý¡¢µÈºÅ¡¢Îö¹¹º¯Êý¡£ |

2Â¥2010-07-27 09:30:14
yalefield
½ð³æ (ÎÄ̳¾«Ó¢)
ÀϺºÒ»Ã¶
- ³ÌÐòÇ¿Ìû: 3
- Ó¦Öú: 129 (¸ßÖÐÉú)
- ¹ó±ö: 0.17
- ½ð±Ò: 21238.9
- É¢½ð: 3440
- ºì»¨: 66
- Ìû×Ó: 12101
- ÔÚÏß: 759.1Сʱ
- ³æºÅ: 96063
- ×¢²á: 2005-10-07
- רҵ: ¸ßµÈ½ÌÓýѧ
- ¹ÜϽ: ¼ÆËãÄ£Äâ
¡ï ¡ï
Сľ³æ(½ð±Ò+0.5):¸ø¸öºì°ü£¬Ð»Ð»»ØÌû½»Á÷
resonant(½ð±Ò+1):»¶Ó²ÎÓ룺-£© 2010-08-10 21:12:29
Сľ³æ(½ð±Ò+0.5):¸ø¸öºì°ü£¬Ð»Ð»»ØÌû½»Á÷
resonant(½ð±Ò+1):»¶Ó²ÎÓ룺-£© 2010-08-10 21:12:29
|
°³ÔÚСÊ÷ÁÖÀïµÄ¿ÕµØÉÏÁ·Ì«¼«£¬×ÜÓм¸¸öС»ï×ÓÒ²À´Á·Ë«½Ú¹÷¡£ ÏëÒ»Ï룬¸ú¼¸¸öгö¿ÇµÄ¹²Í¬¿ª·¢Ò»¸ö¹¤³Ì£¬¾ÍÊÇÕâ¸ö¸Ð¾õ¡£ ËûÃÇ×ÜÊÇÓúܸ´Ôӵġ¢ËûÃÇ×Ô¼º²¢²»ÄÜÕæÕýÕÆÎյĶ«Î÷£¬À´¸ø°³µ·ÂÒ¡£ |
3Â¥2010-07-27 23:15:18
cfem_nli
гæ (³õÈëÎÄ̳)
- Ó¦Öú: 0 (Ó×¶ùÔ°)
- ½ð±Ò: 113.1
- Ìû×Ó: 22
- ÔÚÏß: 67.2Сʱ
- ³æºÅ: 1062018
- ×¢²á: 2010-07-22
- ÐÔ±ð: GG
- רҵ: ±¬Õ¨Óë³å»÷¶¯Á¦Ñ§
¡ï ¡ï
resonant(½ð±Ò+2):ά»¤·Ñ£º-£© 2010-08-10 21:12:48
resonant(½ð±Ò+2):ά»¤·Ñ£º-£© 2010-08-10 21:12:48
|
ÎÒÏë¿ÉÄÜÈÃÄãÓÐËùÎó»áÁË¡£ Ê×ÏÈÄØ£¬Ïë˵¼¸¾äÌâÍâµÄ»°£¬ÀúÀ´µÄÓïÑÔÖ®Õù£¬Æäʵ·¦Î¶£¬´ó¶¼ÊǸ÷ÁìÓòµÄ¶¥¼âµÄһЩÈËÎÔÚÄÇÀïÐû´«×Ô¼ºµÄÖÖÖֺô¦£¬¶ÔÎÒÃÇÀ´Ëµ£¬ÕâÑùµÄÕù±ç±¾ÉíûÓÐÒâ˼£¬µ«ÊÇÄØ£¬¿ÉÒÔ¿´µ½Ò»Ð©ÓïÑԵĻù±¾µÄµ«ÊǺÜÉî²ã´ÎµÄ¶«Î÷£¬È±µã»òÕßÊÇÓŵ㣻 Æä´Î£¬Èç¹ûÒª±çÂÛ£¬ÄÇôҲÊÇ¿´Ó¦Óñ³¾°£¬¾ÍÊÇ˵ÎÒÃÇÒª×öʲôÑùµÄÓ¦Óÿª·¢£¬Ëµ°×ÁË£¬¾ßÌåÓ¦ÓþßÌå·ÖÎö£¬Ã»ÓдóһͳµÄÓïÑÔ ÔÙÈý£¬ÉÔ΢ͨÓÃһЩµÄ²ã´ÎÉÏ£¬±ÈÈç˵ºÜ¶àÈ˰üÀ¨ÎÒ×Ô¼ºµ±Ê±¾ÍÎÊÓ¦¸ÃѧʲôÓïÑԺã¬Èç¹û˵һ¶¨ÊÇÒª¸øµã˵·¨µÄ»°£¬ÄÇô£¬¸öÈËÒÔΪÈÝÒ×ÉÏÊÖÊÇÒ»¸öÊ×ÒªµÄ·¨Ôò¡£¾ÍÊÇ˵£¬¶Ô³õѧÕߣ¬¶ÔÒ»°ã²ã´ÎµÄÈË£¬±ÈÈç˵±¾ÈË£¬Ñ§µÄÀ´£¬µ«ÊÇÄØÓÖ²»ÈÝÒ×·¸´í¡£ ¹ØÓÚÎÒ×Ô¼º£¬Æäʵ·Ç±à³ÌµÄ¿Æ°à³öÉí£¬Ò²²»¸Ò×ÔÈÏΪ¸ßÊÖ£¬Á¦Ñ§³öÉí¡£×öÕâÑùµÄ˼¿¼£¬ÊÇÒòΪµ±Òª×÷ÓÐÏÞÔªÈí¼þ¿ª·¢µÄ»°£¬Ïë±È½Ï±È½ÏÄÇЩÓïÑÔÔÚÄÇЩ·½ÃæÓÐÓÅÊÆ£¬ÎªÊ²Ã´ÏÖÔÚµÄÈí¼þÊÇÏÖÔÚÕâÑùµÄ½á¹¹¹¹³É£¬µÈµÈÎÊÌâ¡£ÕâÑùµÄ±³¾°£¬¼«ÓпÉÄÜÈÃÎÒÏëÎÊÌâµÄ·½Ê½ÓÐÆ«ÆÄ£¬¶ÔÓïÑԵĿ´·¨Ò²À´µÄ²»Èç³ÌÐò¸ßÊÖÄÇôֱ½ÓºÍ¼ò½à£¬Ò»ÓïÖеġ£ ˵Á˲»ÉÙ£¬»Øµ½ÏÈǰµÄÌû×ÓÉÏ¡£Ó¢ÎÄÔÎĵÄһЩ¿´·¨ÈÃÎÒÉîÒÔΪȻ£¬Á½¸öÔÒò£¬Ò»¸öÊÇ£ºËûÉæ¼°µ½ÁËc++µÄ¹¹Ô캯Êý£¬ÔÙÒ»¸öÊÇËý˵µ½µÄÊÇÏîÄ¿¿ª·¢µÄʵ¼ÊÇé¿ö¡£¶ÔÎÒ¼º¶øÑÔ£¬²»ÊDZà³ÌÌØ¶à£¬c++µÄ¹¹Ô캯ÊýºÜÈÃÎÒÍ·ÌÛ£¬ÓÈÆäÊÇÉæ¼°µ½¼Ì³ÐÒԺ󣬹¹Ô캯ÊýºÜ¶àÀà±ð£¬¹¹Ô캯ÊýÀïµÄº¯Êý±äÁ¿¶¨Ò壬³õʼ»¯£¬exception handle£¬Ö¸Õë´¦Àí£¬²»ÉÙµÄÎÊÌ⣬ÈÃÎҸоõÓ¦¸¶À´ÓеãÍ·ÌÛ£¬¾õ×ÅÐèÒªºÜ¶àÁ·Ï°²ÅÐУ» ÕâÊÇËû˵µÄµÚÒ»¸ö·½Ãæ ¡£¹ØÓÚÖ¸ÕëµÄ»°£¬ÎÒÏ룬ËûûÓÐÌá¶àÉÙ£¬µ«ÊǹÀ¼ÆÈò»ÉÙÈ˹¹Í·ÌÛµÄ°É µÚ¶þ¸ö¾ÍÊÇ£¬Êµ¼Ê×öÒ»¸öÏîÄ¿À´Ëµ£¬¾ÍÓкܶàµÄÈËÀ´×ö¡£Top10 »òÕßtop20£¬ÔÚÄãµÄ×éÀÊǸöºÃÊ£¬²»¹ýÓÐÒ»¸ö²îһЩµÄÒ²ÔÚ×ö£¬ÄÇô¿ÉÏë¶øÖªÄãµÄÂé·³ÊÂÒ»¶¨ÊÇÔ´Ô´²»¾ø¡£ºÜÒź¶µÄÊÇ£¬ÄǸöÔì³ÉÕâÖÖ¾ÖÃæµÄÈËÍùÍùÒâʶ²»µ½ÄÇЩDZÔڵĴíÎó¡£ ÖÁÓÚ˵ÔÌûÄÇЩ¶¼Ó¦¸ÃÊÇc++µÄ»ù´¡£¬»òÕß˵ѧ¹ýc++µÄÈ˶¼¸ÃÖªµÀµÄ£¬ÎÒ²»ÖªµÀʵ¼ÊÇé¿ö£¬ÎÒ²»ÖªµÀÔõô¶¨Òåc++µÄ»ù´¡ÄÚÈÝ¡£»òÐí×îºÃÄÜ×öÒ»¸öͳ¼Æ£¬¿´¿´´ó¼Ò³£¼ûµÄ´íÎ󣬻òÕßÁî³ÌÐòÔ±Ãdz£³£Í´ºÞµÄ´íÎó£¬µÈµÈ µ«ÊDz¢²»ÊÇÒªÀ´·ñ¶¨c++£¬linus˵C++ Sucks£¬ÎÒ²»ÖªµÀ£¬Ã»ÓÐËûÄÇôƫ¼¤¡£ »¶ÓÓÐÏëµÄÏë·¨£¬»¶ÓÖ¸Õý¡£ |

4Â¥2010-07-28 08:09:12
cfem_nli
гæ (³õÈëÎÄ̳)
- Ó¦Öú: 0 (Ó×¶ùÔ°)
- ½ð±Ò: 113.1
- Ìû×Ó: 22
- ÔÚÏß: 67.2Сʱ
- ³æºÅ: 1062018
- ×¢²á: 2010-07-22
- ÐÔ±ð: GG
- רҵ: ±¬Õ¨Óë³å»÷¶¯Á¦Ñ§
˳±ã¸ø³ölinusµ±Ê±µÄ¹ØÓÚc++ sucksÕùÂÛµÄÒ»¸öÁ´½Ó
|
Ê×ÏÈÄØ£¬Õâ¸öÁ´½ÓÓеã¸Ð¾õÊÇÆ«ÀëÖ÷ÌâÁË£¬Ö»²»¹ýÊÇÎÒÉÏÃæµÄÌû×ÓÌáµ½ÁËÕâ¸ö£¬ËùÒÔ¾ÍȨ×÷ΪÓéÀÖÐÝÏУ¬Ïë¿´µÄÅóÓѾ͹Ø×¢Ò»Ï ²»Ïë¾ÍÕâ¸ö×÷ΪÌÖÂÛ£¬ÊµÔÚÊÇÁ¦²»´ÓÐÄ ÎÒ¸öÈ˾õµÃÖ®ËùÒÔËûÄÇôƫ¼¤£¬¿ÉÄÜÒ»ÊÇËû×Ô¼ºÊÇÒ»¸öcµÄfan£¬¶þÊÇcµ±Ê±ÊÇΪϵͳ¿ª·¢¶ø×öµÄ£¬¿ÉÄܾÍÊÇÊʺÏlinux kernel°É£¬Ó¡ÏóÖмǵÃËû˵c++ ÊÇÔÚcÉÏÌíÖ¦¼ÓÒ¶£¬¾¡×öЩ²»Í´²»Ñ÷µÄÐ޸ģ¬ËµÀ´ËµÈ¥£¬¶¼²»·¦³´×÷Ö®ÏÓ http://thread.gmane.org/gmane.comp.version-control.git/57918 why c++ sucks by linus |

5Â¥2010-07-28 08:29:13
tjyl
½ð³æ (ÕýʽдÊÖ)
- ³ÌÐòÇ¿Ìû: 2
- Ó¦Öú: 0 (Ó×¶ùÔ°)
- ½ð±Ò: 3218.1
- ºì»¨: 2
- Ìû×Ó: 576
- ÔÚÏß: 156.6Сʱ
- ³æºÅ: 765184
- ×¢²á: 2009-05-07
- רҵ: ÉúÎïÎÞ»ú»¯Ñ§
- ¹ÜϽ: ³ÌÐòÓïÑÔ
¡ï ¡ï
Сľ³æ(½ð±Ò+0.5):¸ø¸öºì°ü£¬Ð»Ð»»ØÌû½»Á÷
resonant(½ð±Ò+1):»¶Ó²ÎÓ룺-£© 2010-08-10 21:12:56
Сľ³æ(½ð±Ò+0.5):¸ø¸öºì°ü£¬Ð»Ð»»ØÌû½»Á÷
resonant(½ð±Ò+1):»¶Ó²ÎÓ룺-£© 2010-08-10 21:12:56
|
Å£ÈËµÄÆ¢ÆøÄÑÃâ»ð±¬Á˵㡣 ÊÂʵ¾ÍÊÇÔÚÄںˡ¢Çý¶¯¿ª·¢»ù±¾¶¼ÓÃCµÄ£¬ÆäʵÕâЩµØ·½²»ÓÃC++ûÓÐɶºÃÆæ¹ÖµÄ¡£ |
6Â¥2010-08-10 18:00:52














»Ø¸´´ËÂ¥