Questions tagged «c++»

有关C ++的问题,C ++是一种静态类型,自由格式,多范式,已编译的通用编程语言。

4
面向数据的设计-不超过1-2个结构“成员”不切实际?
数据导向设计的常见示例是Ball结构: struct Ball { float Radius; float XYZ[3]; }; 然后他们提出了一种迭代std::vector<Ball>向量的算法。 然后它们给您同样的东西,但是在面向数据的设计中实现: struct Balls { std::vector<float> Radiuses; std::vector<XYZ[3]> XYZs; }; 这样做很好,而且如果您要先迭代所有半径,然后遍历所有位置,依次类推,那么一切都很好。但是,如何移动矢量中的球?在原始版本中,如果您有std::vector<Ball> BallsAll,则可以将任何移动BallsAll[x]到任何一个BallsAll[y]。 但是,对于面向数据的版本,要对每个属性执行相同的操作(对于Ball,则必须执行两次(半径和位置)。但是,如果您拥有更多的属性,情况会变得更糟。您必须为每个“球”保留一个索引,并且在尝试移动它时,必须在每个属性向量中进行移动。 这不会破坏面向数据设计的任何性能优势吗?

4
与将字符串连接在一起并一次调用相比,经常调用println()有多糟糕?
该问题是从Code Review Stack Exchange 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 5年前。 我知道输出到控制台是一项昂贵的操作。出于代码可读性的考虑,有时最好调用一个函数两次输出文本,而不是将一长串文本作为参数。 例如,效率降低多少 System.out.println("Good morning."); System.out.println("Please enter your name"); 与 System.out.println("Good morning.\nPlease enter your name"); 在该示例中,区别仅在于一个呼叫,println()如果更多,该怎么办? 与此相关的是,如果要打印的文本很长,则在查看源代码时,涉及打印文本的语句可能看起来很奇怪。假设文本本身不能简短,该怎么办?是否应该出现多次println()通话的情况?曾经有人告诉我,代码行不应超过80个字符(IIRC),那么您将如何处理 System.out.println("Good morning everyone. I am here today to present you with a very, very lengthy sentence in order to prove a point about how …
23 java  c++  performance  c  io 

6
如何解决嵌套评论的问题
不能嵌套注释的语言不只是一种。您对此问题有很好的解决方案吗?在C / C ++和Java中,一种解决方法是仅使用单行注释,但是注释掉较大的块将变得不可能。我正面临着这样的事情: </li><!-- <li><!-- Save --> 因此,我必须手动浏览并编辑评论。您能以多种语言建议我们应该如何处理吗?我不确定,但是python '''可能为此提供了解决方案,可以#在python中添加注释?`
23 java  c++  python  c  comments 

2
提供执行相同操作的不同功能签名是一个好主意吗?
这是一个用三个值构造的C ++类。 class Foo{ //Constructor Foo(std::string, int, char); private: std::string foo; char bar; int baz; }; 所有参数类型都不同。 我可以重载构造函数,因此顺序无关紧要。 class Foo{ //Constructors Foo(std::string, char, int); Foo(std::string, int, char); Foo(char, int, std::string); Foo(char, std::string, int); Foo(int, std::string, char); Foo(int, char, std::string); private: std::string foo; char bar; int baz; }; 但这是个好主意吗? 我开始这样做是因为我知道一个类/函数需要什么东西。 我并不总是记得他们接受了什么命令。 …

2
C#是否可以与本机C ++编译器合并?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 根据这篇文章: http://channel9.msdn.com/Forums/Coffeehouse/MS-working-on-a-same-compiler-for-C-AND-C--Not-in-incubation-but-for-production- 这个帖子有多少真相?硬核C ++程序员(游戏开发者等)应该认真对待吗? 编辑:这个问题还有另一个目的... C#是否可以与C ++向后兼容?
23 c#  c++ 

3
为什么C ++在编程竞赛和竞赛中占主导地位?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我知道C ++是一种非常快速的语言,但是C会不会变得如此快,或者在某些情况下会更快? 然后您可能会说C ++具有OOP,但是大多数编程难题所需要的OOP数量并不多,我认为C可以处理。 这就是我问这个问题的原因:我对编程竞赛和竞赛非常感兴趣,并且我习惯于用C进行编码。但是,我注意到绝大多数人都使用C ++(例如,在Google Code Jam 2011的25个决赛入围者中有17个使用了C ++,而没有人使用C),所以我想知道我在使用C方面是否处于不利地位。 除了对象定向之外,是什么使C ++更适合编程竞赛的语言?为了在比赛中表现更好,我应该学习和使用哪种语言的功能? 对于背景知识,我认为自己非常精通C,但是我才刚刚开始学习C ++。
23 c++  c 

13
“系统匈牙利语”表示法仍然有用吗?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以当前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 8年前关闭。 我在论坛上进行了搜索,但是找不到为什么应避免使用它的答案,而只是为什么它不是灵丹妙药。所以我不认为这个问题是重复的。 是否有有效的理由为什么我应该取消学习惯用的系统匈牙利语? 到目前为止,我发现使用它具有以下好处: 一致的变量命名 您无需搜索即可看到类型(智能在半数时间中已失效/已建立索引,因此这仍然是一个合理的原因) 语义仍然可以包含在名称的第二部分中 以及以下缺点: 惹恼了一些人(不知道为什么) 如果更改了类型,则该类型可能与变量的名称不匹配(我不认为这是正当的理由,类型很少更改,并且您拥有“全部重命名”) 所以为什么: vector<string> vecCityNames; wstring strCity = L"abc"; //more code here vecCityNames.push_back(strCity); 差于: vector<string> cityNames; wstring city = L"abc"; //more code here cityNames.push_back(city);//Are we pushing back int on a queue? Float on a stack? Something else?
23 c++  naming 

7
如果变量具有getter和setter,应该公开吗?
我有一个带有私有变量的类,该类具有该变量的getter和setter方法。为什么不将该变量公开? 我认为您唯一需要使用getter和setter的情况是,是否需要执行除set或get之外的其他操作。例: void my_class::set_variable(int x){ /* Some operation like updating a log */ this->variable = x; }

9
为什么Java / C ++中没有幂运算符?
尽管有这样的运算符- **在Python中,我想知道为什么Java和C ++也没有。 使用运算符重载为用C ++定义的类创建一个对象很容易(而且我相信Java中也可以做到这一点),但是在谈论基本类型(例如int,double等)时,您必须使用库功能类似Math.power(通常必须将两者都强制转换为两倍)。 那么-为什么不为原始类型定义这样的运算符?
23 java  c++  python 

16
如果我不懂C但我对C ++满意,可以吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 我有一个问题,我认为可以在这里得到最好的回答。 我非常擅长C++,就像我对语言感到满意一样,我已经阅读Accelerated C++并完成了几乎所有的练习。 但是,我有一个大问题。我需要学习C吗?C我一生中从未做过。我刚开始C++编程时才刚开始。可能是因为我一直很想知道为什么每个人都称这种语言如此复杂。现在尽管我知道该问题的答案;) 我特别想知道我是否能在不了解C当今世界的情况下生存。就像我在公司里面试一样,如果我告诉他们我不知道C-他们会认为还可以吗?我擅长的两种语言是Python和C ++。我问这个原因是因为我听说公司在面试中询问数据结构。因此,如果他们要求我实现它,并且如果我使用C ++来实现,那么可以接受吗? 还有人说“当您使用C ++时,您怎么不知道C”,请不要回答:)没冒犯,但我不明白为什么学习C是必备条件。
23 c++  c 

1
为什么某些语言的文档说“等于”而不是“是”?
为什么某些语言的文档说“等于”而不是“是”? 例如,Python文档说 itertools.chain(*iterables) ... 等效于: def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element 或者,这个C ++参考的find_if: 该功能模板的行为等效于: template<class InputIterator, class UnaryPredicate> InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred) { while (first!=last) { if (pred(*first)) return first; …

5
调试内存损坏
首先,我确实意识到这不是一个具有绝对答案的完美的问与答风格的问题,但是我想不出任何措辞来使它更好地工作。我认为没有绝对的解决方案,这就是为什么我将其发布在此处而不是Stack Overflow的原因之一。 在过去的一个月中,我一直在重写相当旧的服务器代码(mmorpg),以使其更加现代,并且易于扩展/修改。我从网络部分开始,并实现了一个第三方库(libevent)来为我处理事务。通过所有的重构和代码更改,我在某个地方引入了内存损坏,而我一直在努力寻找发生错误的地方。 我似乎无法在我的开发/测试环境中可靠地重现它,即使实现原始机器人来模拟某些负载时,我也不会再崩溃(我修复了会导致某些问题的libevent问题) 到目前为止,我已经尝试过: 摆脱困境-直到事情崩溃(可能需要1天以上的生产时间或仅仅一个小时)崩溃之前,我才真正感到困惑,这之前肯定没有无效的写入,肯定在某个时候它将访问无效的内存并且不会覆盖内容机会?(是否可以“扩展”地址范围?) 代码分析工具,即coverage和cppcheck。尽管他们确实指出了代码中的一些.nastiness和边缘情况,但没有什么严重的。 记录该过程,直到它与gdb崩溃(通过undodb),然后以反向方式工作。/ sounds /这样的声音应该是可行的,但是我要么通过使用自动完成功能最终导致gdb崩溃,要么由于一些可能的分支(一个损坏导致另一个损坏,因此导致内部迷失)在内部libevent结构中丢失上)。我想如果能看到指针最初属于/分配指针的地方,那将消除大多数分支问题,那就太好了。但是我无法使用undodb运行valgrind,而且我正常的gdb记录的速度实在太慢了(如果甚至可以与valgrind结合使用)。 代码审查!我自己(彻底)并让一些朋友来检查我的代码,尽管我怀疑它是否足够彻底。我当时在考虑也许要雇用一名开发人员与我一起进行一些代码审查/调试,但是我付不起太多钱,而且我也不知道该去哪里寻找愿意为小工作而工作的人-如果他没有找到问题或根本没有资格,那就不要钱。 我还应该指出:我通常会得到一致的回溯。在某些地方发生崩溃,主要与套接字类以某种方式损坏有关。它是指向不是套接字的东西的无效指针,还是套接字类本身被乱码覆盖(部分?)。尽管我怀疑它在那里崩溃最多,因为那是最常用的部分之一,因此它是第一个被使用的损坏的内存。 总而言之,这个问题使我忙了将近2个月(无论是开还是关,都是一个业余项目),这确实让我感到沮丧,以至于我变得脾气暴躁,并想放弃。我只是想不出我应该怎么做才能发现问题。 我错过了任何有用的技术吗?你怎么处理那件事呢?(这可能不那么普遍,因为没有太多相关信息。或者我真的是盲人?) 编辑: 一些重要的规格: 通过gcc 4.7使用c ++(11)(版本由debian wheezy提供) 代码库大约有15万行 编辑以回复david.pfx帖子:(抱歉响应缓慢) 您是否在仔细记录崩溃情况以寻找模式? 是的,我仍然遗漏了最近发生的崩溃事件 几个地方真的很相似吗?用什么方式? 好吧,在最新版本中(每当我添加/删除代码或更改相关结构时,它们似乎都会改变),它总是会陷入项目计时器方法中。基本上,一个项目有一个特定的时间,在该时间之后,它会过期,并将更新的信息发送给客户端。无效的套接字指针将在Player类中(据我所知仍然有效),大部分与此有关。在正常关闭后,我还将在清理阶段遇到大量崩溃,该崩溃将破坏所有未明确破坏的静态类(__run_exit_handlers在回溯中)。大多数情况下只涉及std::map一个类,但猜测这只是第一件事。 损坏的数据是什么样的?零?Ascii?模式? 我还没有找到任何模式,对我来说似乎有点随机。很难说,因为我不知道腐败从哪里开始。 它与堆有关吗? 这完全与堆有关(我启用了gcc的堆栈保护,但没有捕获任何东西)。 腐败发生在a之后free()吗? 您将不得不对此进行详细说明。您是说要让已经释放的对象指向周围吗?一旦对象被销毁,我会将每个引用都设置为null,所以除非我在某处错过了东西,否则不行。那应该在valgrind中显示出来,但是没有。 网络流量是否有与众不同的东西(缓冲区大小,恢复周期)? 网络流量由原始数据组成。因此,对于更复杂的事物,使用char数组,(u)intX_t或packed(以除去填充)结构,每个数据包都有一个标头,该标头由id和数据包大小本身组成,并针对预期大小进行了验证。它们大约为10-60字节,最大的(内部“启动”数据包,在启动时触发一次)大小为几Mb。 大量的生产断言。在损坏蔓延之前及早地发生崩溃。 我曾经有一次与std::map腐败相关的崩溃,每个实体都有其“视图”的地图,每个实体都可以看到它,反之亦然。我在前面和后面添加了200byte的缓冲区,将其填充为0x33,并在每次访问之前对其进行了检查。腐败刚刚消失了,我必须搬走一些东西使它腐败了。 战略性日志记录,因此您可以准确地知道之前发生了什么。当您更接近答案时,将其添加到日志记录中。 它的工作..扩展。 无奈之下,您可以保存状态并自动重启吗?我可以想到一些实现此目的的生产软件。 我有点做。该软件由一个主要的“高速缓存”进程和一些其他工作进程组成,它们均访问高速缓存以获取并保存内容。因此,每次崩溃我都不会失去太多进展,它仍然会断开所有用户的连接,依此类推,这绝对不是解决方案。 并发:线程,竞争条件等 有一个mysql线程可以执行“异步”查询,尽管这一切都未曾动过,并且仅通过具有所有锁定功能的函数才与数据库类共享信息。 中断 有一个中断计时器可以阻止它锁定,如果它在30秒内没有完成一个周期,它只会中止运行,但是该代码应该是安全的: if (!tics) { abort(); } else …
23 c++  debugging  memory 


6
持续集成科学软件
我不是软件工程师。我是地球科学领域的博士生。 大约两年前,我开始编写科学软件。我从未使用过持续集成(CI),主要是因为起初我不知道它的存在,而且我是唯一使用此软件的人。 现在,由于该软件的基础正在运行,因此其他人开始对它产生兴趣并希望为该软件做出贡献。计划是其他大学的其他人正在实施核心软件的添加。(我担心他们会引入错误)。此外,该软件变得非常复杂,并且变得越来越难以测试,我也计划继续进行开发。 由于这两个原因,我现在越来越多地考虑使用CI。因为我从未接受过软件工程师的培训,而且周围的人都没有听说过CI(我们是科学家,所以没有程序员),所以我很难开始我的项目。 我有几个问题想向我寻求建议: 首先简要说明该软件的工作方式: 该软件由一个包含所有必需设置的.xml文件控制。您只需通过将路径传递到.xml文件作为输入参数来启动软件,它就会运行并创建带有结果的几个文件。一次运行可能需要30秒钟。 这是一个科学软件。几乎所有的函数都有多个输入参数,它们的类型主要是非常复杂的类。我有多个具有大型目录的.txt文件,用于创建这些类的实例。 现在让我们来问我的问题: 单元测试,集成测试,端到端测试?:我的软件现在大约有30.000行代码,具有数百个功能和约80个类。开始为数百种已经实现的功能编写单元测试对我来说有点奇怪。因此,我考虑过简单地创建一些测试用例。准备10-20个不同的.xml文件,然后运行该软件。我猜这就是所谓的端到端测试?我经常读到您不应该这样做,但是如果您已经拥有可以运行的软件,那么也许可以开始吗?还是尝试将CI添加到已经运行的软件中只是愚蠢的想法。 如果功能参数难以创建,如何编写单元测试? 假设我有一个函数double fun(vector<Class_A> a, vector<Class_B>),通常,我需要首先读取多个文本文件来创建类型为Class_A和的对象Class_B。我考虑过要创建一些虚拟功能,例如Class_A create_dummy_object()不读取文本文件。我还考虑过实现某种序列化。(我不打算测试类对象的创建,因为它们仅依赖于多个文本文件) 如果结果变化很大,如何编写测试?我的软件利用了大型蒙特卡洛模拟并可以迭代地工作。通常,您需要进行约1000次迭代,并且每次迭代都基于Monte Carlo模拟创建约500-20.000个对象实例。如果一次迭代的一个结果只有一点点不同,则整个即将到来的迭代将完全不同。您如何处理这种情况?我认为这对端到端测试来说很重要,因为最终结果变化很大? 对于CI的其他建议,我们深表感谢。

4
C ++中安全接口的模式是什么
此问题已从Code Review Stack Exchange 迁移,因为可以在Software Engineering Stack Exchange上回答。 迁移 5年前。 注意:以下是C ++ 03代码,但是我们希望在未来两年内升级到C ++ 11,因此我们必须牢记这一点。 我正在编写有关如何用C ++编写抽象接口的指南(针对新手)。我已经阅读了有关Sutter的两篇文章,在互联网上搜索了示例和答案,并进行了一些测试。 此代码不得编译! void foo(SomeInterface & a, SomeInterface & b) { SomeInterface c ; // must not be default-constructible SomeInterface d(a); // must not be copy-constructible a = b ; // must not be assignable …
22 c++ 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.