小编jch*_*chl的帖子

我怎么告诉gcov忽略不可打击的C++代码行?

我正在使用gcov测量我的C++代码中的覆盖率.我希望得到100%的覆盖率,但是由于存在一些理论上无法触及的代码行(需要实现但从未调用过的方法,switch语句的默认分支等等)而受到阻碍).这些分支中的每一个都包含一个assert( false );语句,但是gcov仍然将它们标记为未命中.

我希望能够告诉gcov忽略这些分支.有没有办法给gcov这些信息 - 通过注释源代码或任何其他机制?

c++ code-coverage gcov

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

隐藏使用g ++创建的共享库中的实例化模板

我有一个包含以下内容的文件:

#include <map>

class A {};

void doSomething() {
   std::map<int, A> m;
}
Run Code Online (Sandbox Code Playgroud)

当使用g ++编译成共享库时,库包含所有方法的动态符号std::map<int, A>.由于A该文件是私有的,因此不可能std::map在具有相同参数的任何其他共享库中实例化,因此我想隐藏模板实例化(出于本文档中描述的某些原因).

我想我应该能够通过添加模板类的显式实例化并将其标记为隐藏来完成此操作,如下所示:

#include <map>

class A {};
template class __attribute__((visibility ("hidden"))) std::map<int, A>;

void doSomething() {
   std::map<int, A> m;
}
Run Code Online (Sandbox Code Playgroud)

但是,这没有任何效果:符号仍然全部导出.我还尝试用以下方法包围整个文件:

#pragma GCC visibility push(hidden)
...
#pragma GCC visibility pop
Run Code Online (Sandbox Code Playgroud)

但这对方法的可见性也没有影响std::map<int, A>(虽然它确实隐藏doSomething).同样,编译时-fvisibility=hidden对方法的可见性没有影响std::map<int, A>.

我上面链接的文档描述了使用导出地图来限制可见性,但这似乎非常繁琐.

有没有办法在g ++中做我想要的(除了使用导出地图)?如果是这样,它是什么?如果没有,是否有充分的理由为什么必须始终导出这些符号,或者这只是g ++中的遗漏?

c++ templates visibility g++

13
推荐指数
1
解决办法
4807
查看次数

复杂多重继承层次结构中"虚拟"关键字在哪里?

我理解C++虚拟继承的基础知识.但是,我很困惑我需要在virtual复杂的类层次结构中使用关键字.例如,假设我有以下类:

            A
           / \
          B   C
         / \ / \
        D   E   F
         \ / \ /
          G   H
           \ /
            I
Run Code Online (Sandbox Code Playgroud)

如果我想确保在任何子类中都没有出现过多次类,那么需要标记哪些基类virtual?他们都是?或者只在那些直接从一个类派生的类上使用它就足够了,否则这个类可能有多个实例(即B,C,D,E和F;以及G和H(但只有基类E,而不是基类D和F))?

c++ multiple-inheritance virtual-inheritance

13
推荐指数
2
解决办法
1924
查看次数

多个帐户中的AdWords关键字/广告组/广告系列ID是否唯一?

在Google AdWords API中,我认为关键字ID和广告组ID(以及显然广告系列ID)在帐户中是唯一的(而不是关键字ID在其封闭广告组中唯一,而广告组ID在其封闭广告系列中仅是唯一的).

但它们是否保证在多个帐户中是唯一的?

google-adwords

11
推荐指数
3
解决办法
8470
查看次数

如何确定Python 2.7.5中的实习字符串数?

在早期版本的Python中(我不记得哪个),gc.get_referrers可以使用对任意实习字符串的调用来获取对interneddict 的引用,然后可以查询其长度.

但是这不再适用于Python 2.7.5:gc.get_referrers(...)不再包含interned它返回的列表中的dict.

在Python 2.7.5中,有没有其他方法来确定实习字符串的数量?如果是这样,怎么样?

python string string-interning

11
推荐指数
1
解决办法
328
查看次数

内联成员函数使用的静态全局变量

当您在C++头文件中有一个静态全局变量时,包含头文件的每个翻译单元最终都会有自己的变量副本.

但是,如果我在同一个头文件中声明一个类,并创建该类的成员函数,在类声明中实现内联,它使用静态全局变量,例如:

#include <iostream>

static int n = 10;

class Foo {
 public:
   void print() { std::cout << n << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)

然后我看到gcc 4.4下的一些奇怪的行为:

  1. 如果我在没有优化的情况下编译,则成员函数的所有使用都使用来自其中一个翻译单元(g ++命令行中提到的第一个)的变量副本.

  2. 如果我编译-O2,每次使用成员函数都使用来自翻译单元的变量的副本.

显然这是一个非常糟糕的设计,所以这个问题只是出于好奇.但是,我的问题是,C++标准对此案例的说法是什么?通过在启用和不启用优化的情况下提供不同的行为,g ++是否正常运行?

c++ gcc global-variables

10
推荐指数
1
解决办法
1402
查看次数

如何以编程方式获取Linux上的堆地址

我可以获取堆结尾的地址sbrk(0),但有没有办法以编程方式获取堆的起始地址,而不是通过解析内容/proc/self/maps

c linux heap

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

内存中的虚拟表格布局?

虚拟表如何存储在内存中?他们的布局?

例如

class A{
    public:
         virtual void doSomeWork();
};

class B : public A{
    public:
         virtual void doSomeWork();
};
Run Code Online (Sandbox Code Playgroud)

内存中A类和B类虚拟表的布局如何?

c++ vtable

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

库初始化后从RAM刷新ELF部分

我在ELF共享库中有很多代码,只在库初始化期间使用它(它是从静态初始化程序调用的).如果我把这段代码放在它自己的部分(或者它可以放在.init部分中),我可以使用__attribute__((section(".mysection"))),有没有办法在库加载后强制将该部分分页?

这个问题是相关的,但结论是内核会在内存不足时分页出未使用的页面,所以没有必要明确地这样做.但是,我正在一个内存非常宝贵的嵌入式环境中工作,而来自磁盘(慢速USB闪存驱动器)的代码分页成本很高.因此,我宁愿显式刷新这段代码,我知道这些代码永远不会被再次使用,而不是内核可能决定刷新其他可能最终需要重新分页的代码.

我确定我记得读过有关系统调用的内容,要求内核进入或退出某些内存区域,虽然我无法在任何地方找到任何引用,所以也许我想象它.这样的事情存在吗?

linux memory-management elf

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

如何仅为某些模式启用空白模式

我试图whitespace-mode仅在某些模式下自动启用emacs .根据文档,启用global-whitespace-mode和设置whitespace-global-modes变量应该完全相同.但我不能让它正常工作.

在我的.emacs.el身上:

(require 'whitespace)
(global-whitespace-mode t)
(setq whitespace-global-modes '(c-mode c++-mode))
Run Code Online (Sandbox Code Playgroud)

whitespace-global-modes似乎忽略了定义; global-whitespace-mode在每个缓冲区中启用.我知道我的变量名称正确,因为C-h v whitespace-global-modes告诉我:

whitespace-global-modes's value is (c-mode c++mode)

Documentation:
Modes for which global `whitespace-mode' is automagically turned on.
...
Run Code Online (Sandbox Code Playgroud)

那么我做错了什么?我误解了目的whitespace-global-modes吗?

我正在运行emacs 23.2.1.

emacs dot-emacs

7
推荐指数
2
解决办法
1791
查看次数