相关疑难解决方法(0)

您被迫遵循的最奇怪的编码标准规则是什么?

当我问这个问题时,我几乎总是肯定是的,你应该有编码标准.

您曾被迫遵循的最奇怪的编码标准规则是什么?

而最奇怪的是,我的意思是最有趣,或者最糟糕,或者只是简单的奇怪.

在每个答案中,请提及哪种语言,您的团队规模,以及它对您和您的团队造成的影响.

coding-style

173
推荐指数
72
解决办法
23万
查看次数

哪个(如果有的话)C++编译器会进行尾递归优化?

在我看来,在C和C++中进行尾递归优化是完美的,但是在调试时我似乎永远不会看到表示此优化的帧堆栈.这有点好,因为堆栈告诉我递归的深度.但是,优化也会很好.

是否有任何C++编译器进行此优化?为什么?为什么不?

我如何告诉编译器这样做?

  • 对于MSVC:/O2/Ox
  • 对于海湾合作委员会:-O2-O3

如何在某种情况下检查编译器是否已完成此操作?

  • 对于MSVC,启用PDB输出以跟踪代码,然后检查代码
  • 对于GCC ..?

我仍然会建议如何确定编译器是否对某个函数进行了优化(尽管我发现它让人放心,Konrad告诉我假设它)

总是可以通过进行无限递归来检查编译器是否完成此操作,并检查它是否导致无限循环或堆栈溢出(我用GCC做了这个并且发现这-O2已经足够了),但我想成为能够检查我知道的某个功能无论如何都会终止.我很想有一个简单的方法来检查这个:)


经过一些测试,我发现析构函数破坏了进行优化的可能性.有时可能值得更改某些变量和临时值的范围,以确保它们在return语句开始之前超出范围.

如果在尾调用后需要运行任何析构函数,则无法进行尾调用优化.

c++ optimization tail-recursion

144
推荐指数
5
解决办法
4万
查看次数

C/C++中的无限循环

有几种可能性来进行无限循环,这里有一些我会选择:

  • for(;;) {}
  • while(1) {}/while(true) {}
  • do {} while(1)/do {} while(true)

是否有某种形式应该选择?现代编译器是否会在中间和最后一个语句之间产生影响,或者它是否意识到它是一个无限循环并完全跳过检查部分?

编辑:因为已经提到我忘记了goto,但这是因为我根本不喜欢它作为一个命令.

Edit2:我对从kernel.org获取的最新版本做了一些grep.我确实看起来随着时间的推移没有太大变化(至少在内核中) 在此输入图像描述

c c++ loops infinite-loop

57
推荐指数
7
解决办法
9万
查看次数

在顶部或底部测试循环?(而与之相比)

当我在大学(80年代中期)学习CS时,不断重复的一个想法是总是写出在顶部(而不是......)而不是在底部(做...同时)测试的循环.环.这些概念通常以对研究的参考作为后盾,这些研究表明,在顶部测试的循环在统计上比其底部测试对应物更可能是正确的.

结果,我几乎总是编写在顶部测试的循环.如果它在代码中引入了额外的复杂性,我不会这样做,但这种情况似乎很少见.我注意到一些程序员几乎专门编写在底部测试的循环.当我看到像这样的结构:

if (condition)
{
    do
    {
       ...
    } while (same condition);
}
Run Code Online (Sandbox Code Playgroud)

或者反过来(if在里面while),它让我想知道他们是否真的以这种方式编写它,或者if当他们意识到循环没有处理null情况时他们添加了语句.

我做了一些谷歌搜索,但没有找到任何关于这个主题的文献.你们(和女孩们)如何写你的循环?

language-agnostic loops while-loop do-while

23
推荐指数
9
解决办法
1万
查看次数

为什么使用无限循环?

另一张海报询问了无限循环的首选语法.

后续问题:为什么在代码中使用无限循环?我通常会看到这样的结构:

for (;;) {
  int scoped_variable = getSomeValue();
  if (scoped_variable == some_value) {
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

这让你无法在foror while子句中看到scoped_variable的值."无限"循环有哪些其他用途?

c++ coding-style

8
推荐指数
4
解决办法
1万
查看次数

条件表达式中的常量值

关于无限循环编码风格问题中,有些人提到他们更喜欢for(;;)样式,因为while(true)样式在MSVC上给出关于条件表达式是常量的警告消息.

这让我感到非常惊讶,因为在条件表达式中使用常量值是避免#ifdef地狱的有用方法.例如,您可以在标题中:

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif
Run Code Online (Sandbox Code Playgroud)

代码可以简单地使用条件并信任编译器在未定义CONFIG_FOO时删除死代码:

if (foo_enabled) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

每次使用foo_enabled时,不必测试CONFIG_FOO:

#ifdef CONFIG_FOO
if (foo_enabled) {
    ...
}
#endif
Run Code Online (Sandbox Code Playgroud)

这种设计模式一直在Linux内核中使用(例如,include/linux/cpumask.h在禁用SMP时将几个宏定义为1或0,在启用SMP时定义为函数调用).

MSVC警告的原因是什么?另外,有没有更好的方法来避免#ifdef hell而不必禁用该警告?或者这是一个过于广泛的警告,一般不应该启用?

c c++ warnings visual-c++

8
推荐指数
2
解决办法
4900
查看次数

最好的无限循环

可能重复:
while(1)Vs. for(;;)有速度差吗?

嗨,

哪种更好,更快,更优化的方式来实现无限循环 - for(;;)或while(1)?为什么?

c optimization loops infinite

6
推荐指数
2
解决办法
4823
查看次数

空循环而不循环检查条件

在一个多线程的C++程序中,我在一个线程中运行相当于这个:

while(obj->member) { } // waiting for obj->member to be set to false in another thread
Run Code Online (Sandbox Code Playgroud)

在另一个线程中,obj-> member设置为false.但是,即使将其设置为false,循环也不会中断.如果我改成它:

while(obj->member) { Sleep(1) }
Run Code Online (Sandbox Code Playgroud)

当obj-> member在另一个线程中设置为false时,它按预期工作并中断.
它为什么这样工作?

c++ multithreading sleep while-loop conditional-statements

5
推荐指数
2
解决办法
2315
查看次数

"for(;;)"的目的是什么?

在旧的代码库中,我找到了以下代码段:

for(;;){
  // code that manipulates a vector 'vec'
  if(vec.empty()) break;
}
Run Code Online (Sandbox Code Playgroud)

除了个人作品的个人品味之外,是否有任何目的或惯例for(;;)代替使用while(true)

c++

3
推荐指数
1
解决办法
130
查看次数

C++:for(;;)的目的?

我只想知道for(;;)以下代码中该行的原因.

//
// blocking_tcp_echo_server.cpp
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>

using boost::asio::ip::tcp;

const int max_length = 1024;

typedef boost::shared_ptr<tcp::socket> socket_ptr;

void session(socket_ptr sock)
{
  try
  {
    for (;;)
    {
      char data[max_length];

      boost::system::error_code error;
      size_t length = sock->read_some(boost::asio::buffer(data), …
Run Code Online (Sandbox Code Playgroud)

c++ for-loop boost-asio

0
推荐指数
2
解决办法
202
查看次数