小编SF.*_*SF.的帖子

Clang vs GCC - 产生更好的二进制文件?

我目前正在使用GCC,但最近我发现了Clang而且我正在考虑切换.但是有一个决定性的因素 - 它产生的二进制文件的质量(速度,内存占用,可靠性) - 如果gcc -O3能够生成运行速度快1%或内存减少1%的二进制文件,那么它就是一个交易破坏者.

Clang拥有比GCC更好的编译速度和更低的编译时内存占用,但我真的对基准测试/比较结果编译软件感兴趣 - 你能指点我一些或描述你的经历吗?

compiler-construction optimization benchmarking gcc clang

228
推荐指数
7
解决办法
10万
查看次数

具有ANSI代码的文本编辑器/查看器呈现对Windows的支持

我需要一些工具来在Windows上正确显示包含ANSI代码的文本.不需要完全支持,但至少必须着色/粗体.

原因:我的记录器/调试模块产生很好的渲染丰富的输出,重要部分使用ANSI代码着色.这在串行终端上进行调试时有很大帮助,但是如果我将调试转储到文件或将其复制粘贴到Windows上的文本编辑器中(交互式远程调试并不总是可行),最好剥离所有ANSI代码,在最坏的情况下,它们被渲染为模糊真实数据的垃圾字符.初级编辑功能将被理解为能够挑选出特定部分,注释等.

windows syntax-highlighting editor ansi

33
推荐指数
4
解决办法
3万
查看次数

是+ =,| =,&=等原子?

就像是"修改"运营商+=,|=,&=等原子?

我知道++是原子的(如果你x++;同时在两个不同的线程中执行),你总是会x增加2,而不是x=x+1关闭优化.)

我想知道是否variable |= constant,以及喜欢是线程安全的还是我必须使用互斥锁来保护它们?

(...或者它是否依赖于CPU?在这种情况下,它在ARM上是怎么回事?)

c c++ atomic operators thread-safety

32
推荐指数
3
解决办法
2621
查看次数

宏值的字符串化

我遇到了一个问题 - 我需要使用宏值作为字符串和整数.

 #define RECORDS_PER_PAGE 10

 /*... */

 #define REQUEST_RECORDS \
      "SELECT Fields FROM Table WHERE Conditions" \
      " OFFSET %d * " #RECORDS_PER_PAGE \
      " LIMIT " #RECORDS_PER_PAGE ";"

 char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN];

 /* ...and some more uses of RECORDS_PER_PAGE, elsewhere... */
Run Code Online (Sandbox Code Playgroud)

这失败了一条关于"stray#"的消息,即使它有效,我想我会得到字符串化的宏名称,而不是值.当然,我可以将值提供给最终的方法("LIMIT %d ", page*RECORDS_PER_PAGE),但它既不漂亮也不高效.当我希望预处理器不以特殊方式处理字符串并且像普通代码一样处理它们的内容时,就像这样.就目前而言,我对它进行了解决,#define RECORDS_PER_PAGE_TXT "10"但可以理解的是,我对它并不满意.

怎么做对吗?

c string concatenation c-preprocessor

32
推荐指数
2
解决办法
4万
查看次数

上下文感知合并?

是否存在用于编程语言的差异/合并工具,它以语法识别的方式工作(如XML Diff Tool),不仅仅是逐行比较(并且可选地忽略空格).

我对实际遵循语言语法和分隔符的程序感兴趣,建议在不破坏语法正确性的情况下进行更改,或者在多行中分隔语句.示例行为是:

*找到一个if(){引入额外嵌套级别的自动捆绑闭合支撑}下面的几行.)

*保持匹配语法元素在一起,避免像删除块往往创建的愚蠢:

 int function_A()
 { 
     int ret;
     ret = something;
     ret += something_else;
Run Code Online (Sandbox Code Playgroud)

      return ret;
  }

  int function_B()
  { 
     if(valid)
     {
         int ret;
         ret = something;
         ret += something_else;
Run Code Online (Sandbox Code Playgroud)

          return ret;
      }
Run Code Online (Sandbox Code Playgroud)

       else return -1;
  }
Run Code Online (Sandbox Code Playgroud)

就个人而言,我很想找到能够处理C++语法的软件,但了解其他语言的解决方案也会很有趣.

cvs diff merge semantic-analysis

32
推荐指数
6
解决办法
5336
查看次数

在一个Eclipse项目中构建多个二进制文件

如何让Eclipse在一个项目中一次构建多个二进制文件(无需手动编写Makefile)?

我有一个CGI项目,导致Web服务器运行多个.cgi程序,以及它们使用的几个库.用于构建它的手工制作的Makefile慢慢变得不可维护.我们使用Eclipse的"内部构建"来构建所有其他项目,我们也更喜欢在这里使用它,但是为了我的利益,我找不到如何让Eclipse构建多个小程序而不是链接一切成二进制.

c++ eclipse makefile build

24
推荐指数
1
解决办法
2万
查看次数

获取xmllint以输出xpath结果\n-分隔,用于属性选择器

如何让xmllint为"每行"属性输出xpath选择器的多个结果?

举个例子:

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <config>
          <tagX key1="value1 " key2=" value2"/>
          <tagY key3="value3" key4=" value4 "/>
  </config>


  $ xmllint example.xml --xpath "/config/*/@*"
Run Code Online (Sandbox Code Playgroud)

结果是:

   key1="value1 " key2=" value2" key3="value3" key4=" value4 "
Run Code Online (Sandbox Code Playgroud)

我想得到的是:

   key1="value1 "
   key2=" value2"
   key3="value3"
   key4=" value4 "
Run Code Online (Sandbox Code Playgroud)

我需要在偶数引号之后拆分,还是有更简洁的方法来做到这一点?

有一个相关的问题,关于相同的主题,除了它是关于挑选的内容<tag>value</tag>,而不是<tag attribute="value" />

xml shell parsing

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

#define foo()的目的是做{}而(0)

在浏览LinCAN驱动程序的源代码时,我发现了一些困扰我的宏.

#else /*CONFIG_PREEMPT*/
#define can_preempt_disable()      do { } while (0)
#define can_preempt_enable()       do { } while (0)
#endif /*CONFIG_PREEMPT*/
Run Code Online (Sandbox Code Playgroud)

我理解的有用性

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

使用break作为一种throw.我半理解包装一系列函数,如

#define FOO() do { foo(); bar(); } while (0)
Run Code Online (Sandbox Code Playgroud)

避免使用无支撑的警告if.我理解有时#define需要"无操作语句".但为什么这种特殊的呢?特别是,空括号,虚假条件,做......而?一些语法警告我无法理解?

c loops

22
推荐指数
2
解决办法
1692
查看次数

为什么初始化程序列表顺序必须匹配成员声明顺序

如果初始化列表顺序与类中的变量顺序不匹配,为什么gcc会抛出一个合适的东西呢?

class myClass
{
public:
   int A;
   int B;
   myClass();
};

myClass::myClass() :
B(1),
A(2)
{}
Run Code Online (Sandbox Code Playgroud)

将导致:

file.h:274: warning: 'myClass::A' will be initialized after
file.h:273: warning:   'int myClass::B
file.cpp:581: warning:   when initialized here
Run Code Online (Sandbox Code Playgroud)

发出这种警告有什么具体原因吗?是否存在与初始化类变量相关的风险,其顺序与在类中定义的顺序不同?

(注意,有一个问题触及了这个主题,但答案几乎是"因为它应该是这样"而没有给出任何理由,为什么应该订购,或者这有什么不对的故障 - 我会想知道为什么存在这样的限制 - 有人会举例说明它可能适得其反吗?)

c++ constructor initializer-list

20
推荐指数
2
解决办法
6275
查看次数

删除文件的开头而不重写整个文件

我有一个嵌入式Linux系统,它将数据存储在一个非常大的文件中,并将新数据附加到最后.随着文件大小增加到填充可用存储空间附近,我需要删除最旧的数据.

问题是,我不能真正接受将大量数据"移动"到文件中所需要的中断,就像正常一样 - 将文件锁定一段时间只是为了重写它(加上这是一个闪存介质) ,这会对闪光灯造成不必要的磨损).

可能最简单的方法是将文件拆分成多个较小的文件,但这有几个与数据处理和处理方式相关的缺点 - 所有"客户端"软件都需要单个文件.OTOH它可以处理将第一个记录减半的'腐败',因此文件不需要在记录偏移处进行修整,只需"在那里某处",例如,前几个iNode被释放.无论如何,最旧的数据已经过时,因此文件开头的更严重的损坏是完全可以接受的,只要"尾巴"保持清洁,并且可以采取多少精确删除的自由 - "大约几个第一兆字节"是可以的,无需'先精确4096KB'精度.

是否有一些方法,API,技巧,黑客来截断这样的文件的开头?

c c++ linux file-io

18
推荐指数
2
解决办法
2014
查看次数