我正在使用gcov测量我的C++代码中的覆盖率.我希望得到100%的覆盖率,但是由于存在一些理论上无法触及的代码行(需要实现但从未调用过的方法,switch
语句的默认分支等等)而受到阻碍).这些分支中的每一个都包含一个assert( false );
语句,但是gcov仍然将它们标记为未命中.
我希望能够告诉gcov忽略这些分支.有没有办法给gcov这些信息 - 通过注释源代码或任何其他机制?
我有一个包含以下内容的文件:
#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++虚拟继承的基础知识.但是,我很困惑我需要在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))?
在Google AdWords API中,我认为关键字ID和广告组ID(以及显然广告系列ID)在帐户中是唯一的(而不是关键字ID在其封闭广告组中唯一,而广告组ID在其封闭广告系列中仅是唯一的).
但它们是否保证在多个帐户中是唯一的?
在早期版本的Python中(我不记得哪个),gc.get_referrers
可以使用对任意实习字符串的调用来获取对interned
dict 的引用,然后可以查询其长度.
但是这不再适用于Python 2.7.5:gc.get_referrers(...)
不再包含interned
它返回的列表中的dict.
在Python 2.7.5中,有没有其他方法来确定实习字符串的数量?如果是这样,怎么样?
当您在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下的一些奇怪的行为:
如果我在没有优化的情况下编译,则成员函数的所有使用都使用来自其中一个翻译单元(g ++命令行中提到的第一个)的变量副本.
如果我编译-O2
,每次使用成员函数都使用来自翻译单元的变量的副本.
显然这是一个非常糟糕的设计,所以这个问题只是出于好奇.但是,我的问题是,C++标准对此案例的说法是什么?通过在启用和不启用优化的情况下提供不同的行为,g ++是否正常运行?
我可以获取堆结尾的地址sbrk(0)
,但有没有办法以编程方式获取堆的起始地址,而不是通过解析内容/proc/self/maps
?
虚拟表如何存储在内存中?他们的布局?
例如
class A{
public:
virtual void doSomeWork();
};
class B : public A{
public:
virtual void doSomeWork();
};
Run Code Online (Sandbox Code Playgroud)
内存中A类和B类虚拟表的布局如何?
我在ELF共享库中有很多代码,只在库初始化期间使用它(它是从静态初始化程序调用的).如果我把这段代码放在它自己的部分(或者它可以放在.init部分中),我可以使用__attribute__((section(".mysection")))
,有没有办法在库加载后强制将该部分分页?
这个问题是相关的,但结论是内核会在内存不足时分页出未使用的页面,所以没有必要明确地这样做.但是,我正在一个内存非常宝贵的嵌入式环境中工作,而来自磁盘(慢速USB闪存驱动器)的代码分页成本很高.因此,我宁愿显式刷新这段代码,我知道这些代码永远不会被再次使用,而不是内核可能决定刷新其他可能最终需要重新分页的代码.
我确定我记得读过有关系统调用的内容,要求内核进入或退出某些内存区域,虽然我无法在任何地方找到任何引用,所以也许我想象它.这样的事情存在吗?
我试图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.