小编Sma*_*acL的帖子

研究最佳代码宽度?

如果在所选的IDE中启用"查看右边距",则可能默认为80个字符.我倾向于将它改为120,除了它是几年前我公司的标准,没有其他公司告诉我做不同的事情.

我的问题是,是否有任何研究实际上显示80个字符是代码可读性的最佳最大宽度,或者这个值只是"它一直是这样的方式"而没有人真正知道为什么会这样?并且,一行代码的宽度是否应该是编码标准的一部分?

code-readability

121
推荐指数
7
解决办法
3万
查看次数

半冒号课后声明括号

事先道歉可能是一个愚蠢的问题,但在C++类中,为什么在结束后的分号呢?我经常忘记它并得到编译器错误,因而浪费时间.对我来说似乎有些多余,这种情况不太可能发生.人们真的做的事情

class MyClass
{
.
.
.
} MyInstance;
Run Code Online (Sandbox Code Playgroud)

编辑:我从结构和枚举的C兼容性角度得到它,但由于类不是C语言的一部分,我想主要是在类似的声明构造之间保持一致性.我想要的是与设计原理更相关,而不是能够改变任何东西,尽管一个好的代码完成IDE可能会在编译之前捕获它.

c++ oop class declaration

74
推荐指数
5
解决办法
3万
查看次数

在现代C和C++中不推荐使用f(void)

我目前正在重构/整理C++项目中使用的一些旧C代码,并定期查看以下函数:

int f(void)
Run Code Online (Sandbox Code Playgroud)

我倾向于写作:

int f()
Run Code Online (Sandbox Code Playgroud)

是否有任何理由不在整个代码库中用()替换(void)以提高一致性,或者两者之间是否存在我不知道的细微差别?更具体地说,如果C++中的虚拟成员函数被描述为:

virtual int f(void)
Run Code Online (Sandbox Code Playgroud)

派生类包括成员函数:

int f()
Run Code Online (Sandbox Code Playgroud)

这是一个有效的覆盖?另外,基于几乎相同的签名,我是否可能遇到任何链接器问题?

c c++ refactoring void

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

在C和C++中使用逗号而不是分号的效果

我在很多时候注意到重构各种C和C++代码时使用的是逗号,而不是使用分号来分隔语句.像这样的东西;

int a = 0, b = 0;
a = 5, b = 5;
Run Code Online (Sandbox Code Playgroud)

我期待的地方

int a = 0, b = 0;
a = 5; b = 5;
Run Code Online (Sandbox Code Playgroud)

我知道C和C++允许使用逗号分隔语句(特别是循环标题),但这两段代码之间有什么区别?我的猜测是,逗号已经留下了剪切和粘贴的结果,但这是一个错误,是否会影响执行?

c c++

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

C和C++优化器通常知道哪些函数没有副作用?

比如非常常见的数学函数,例如sin,cos等等...编译器是否意识到它们没有副作用并且能够将它们移动到外部循环?例如

// Unoptimized

double YSinX(double x,int y)
{
   double total = 0.0;
   for (int i = 0; i < y; i++)
      total += sin(x);
   return total;
}

// Manually optimized

double YSinX(double x,int y)
{
   double total = 0.0, sinx = sin(x);
   for (int i = 0; i < y; i++)
      total += sinx;
   return total;
}
Run Code Online (Sandbox Code Playgroud)

如果他们可以,有没有办法声明一个函数没有副作用,因此可以安全地以这种方式进行优化?VS2010应用程序的初始分析表明优化是有益的.

另请参阅这个相关的问题,这个问题很接近但不能完全回答我自己的问题.

编辑:一些很棒的答案.我接受的那个基于它作为答案本身引起的评论,特别是链接的文章,以及在errno设定的情况下(即副作用)可能不会发生提升的事实.因此,在我正在做的事情的背景下,这种类型的手动优化似乎仍然有意义.

c c++ optimization

42
推荐指数
4
解决办法
2225
查看次数

如何使用C++模板减少编译时间

我正在将我的C++应用程序的一部分从使用旧的C类型数组更改为模板化的C++容器类.有关详情,请参阅此问题.虽然解决方案运行良好,但我对模板化代码所做的每一个小改动都会导致进行大量的重新编译,从而大大减慢构建时间.有没有办法从标题中取出模板代码并返回到cpp文件,这样小的实现更改不会导致重大的重建?

c++ templates compile-time

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

如何从Visual C++中的版本资源中读取

我在C++项目的资源中有一个版本资源,其中包含版本号,版权和构建详细信息.是否有一种简单的方法可以在运行时访问它以填充我的帮助/关于对话框,因为我目前正在维护此信息的单独const值.理想情况下,该解决方案应适用于Windows/CE移动版和早期版本的Visual C++(6.0以上版本).

c++ resources version visual-c++

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

我可以在C++中使用memcpy来复制没有指针或虚函数的类

说我有一个类,如下所示;

class MyClass
{
public:
  MyClass();
  int a,b,c;
  double x,y,z;
};

#define  PageSize 1000000

MyClass Array1[PageSize],Array2[PageSize];
Run Code Online (Sandbox Code Playgroud)

如果我的类没有指针或虚拟方法,使用以下是否安全?

memcpy(Array1,Array2,PageSize*sizeof(MyClass));
Run Code Online (Sandbox Code Playgroud)

我问的原因是,我正在处理非常大的分页数据集合,如此处所述,性能至关重要,而memcpy与迭代分配相比具有显着的性能优势.我怀疑它应该没问题,因为'this'指针是一个隐含的参数而不是存储的任何东西,但是我还应该注意其他任何隐藏的恶意吗?

编辑:

根据sharptooths评论,数据不包括任何句柄或类似的参考信息.

根据Paul R的评论,我已经分析了代码,在这种情况下避免复制构造函数的速度提高了4.5倍.这里的部分原因是我的模板化数组类比给定的简单示例稍微复杂一些,并且在为不允许浅复制的类型分配内存时调用了一个放置'new'.这实际上意味着调用默认构造函数以及复制构造函数.

第二次编辑

或许值得指出的是,我完全接受以这种方式使用memcpy是不好的做法,在一般情况下应该避免使用.它正在使用的特定情况是高性能模板化数组类的一部分,它包含一个参数'AllowShallowCopying',它将调用memcpy而不是复制构造函数.这对于诸如删除数组开头附近的元素以及将数据分入和分出二级存储之类的操作具有很大的性能影响.更好的理论解决方案是将类转换为一个简单的结构,但是考虑到这需要对大型代码库进行大量重构,避免它不是我想做的事情.

c++ performance shallow-copy

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

在C++中,我可以从结构中派生一个类

这个问题说的都是真的.我是否允许从结构派生一个类,或者我应该创建一个嵌入我的结构的类并定义复制构造函数和一个=运算符来在两者之间移动?

c++ data-structures

26
推荐指数
3
解决办法
2万
查看次数

在C++中过度使用`this`

我正在处理一个大型代码库,它始终使用以下构造

class MyClass
{
public:
  void f(int x);
private:
  int x;
};


void MyClass::f(int x)
{
'
'
  this->x = x;
'
'
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我总是使用,因此更喜欢这种形式

class MyClass
{
public:
  void f(int x);
private:
  int _x;
};


void MyClass::f(int x)
{
'
'
  _x = x;
'
'
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢后者的原因是它更简洁(更少的代码=更少的潜在错误),并且我不喜欢在范围内同时拥有多个同名的变量,我可以避免它.也就是说,我现在越来越多地看到以前的用法.我不知道第二种方法有什么好处吗?(例如,对编译时的影响,使用模板化代码等等)两种方法的优点是否足够重要,另一方面是否重构?我要问的原因是,虽然我不喜欢代码中存在的第二种方法,但是引入更多错误的工作量和相关风险并不值得重构.

c++ refactoring this

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