小编Ita*_*rom的帖子

如何禁止在编译时使用全局变量

有没有办法禁止使用全局变量?

我希望GCC在定义全局变量时在编译时生成错误.

我们有一个应该按线程运行的代码,并且只允许使用堆栈(这是线程安全的)

有办法强制执行吗?

一些GCC标志或其他方式来验证它?

c compiler-construction gcc

21
推荐指数
2
解决办法
943
查看次数

强制free()将malloc内存返回给OS

似乎即使我释放了由malloc()分配的Linux进程的所有内存之后,内存仍然为该进程保留,并且没有返回给OS。

默认情况下运行valgrind massif工具不会泄漏。

使用--pages-as-heap = yes运行valgrind会显示以下内容:

-> 13.77%(7,655,424B)0x35FEEEB069:brk(brk.c:31)

-> 13.77%(7,655,424B)0x35FEEEB113:sbrk(sbrk.c:53)

-> 13.77%(7,655,424B)0x35FEE82717:__default_morecore(morecore.c:48)

-> 13.77%(7,655,424B)0x35FEE7DCCB:_int_malloc(malloc.c:2455)

-> 13.77%(7,655,424B)0x35FEE7F4F1:malloc(malloc.c:2862)

因此,即使内存已经由free()释放,似乎malloc调用了brk / sbrk,也没有将其返回给操作系统。

如何强制free()立即调用sbrk()并将所有内存返回给OS?

我在每个MB都非常重要的低端平台上运行。

提前致谢。

c linux memory memory-management glibc

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

如果成员在一个集合中,则快速排除

我有一小组数字,我经常需要搜索.

这个群体是静止的,并且在开始时就已知道了.

我从观察中得知,我搜索的数字大部分时间都不属于小组.

我正在寻找的是一个算法,在一两条指令中:

  1. 永远不会说一个数字不在群体中而且确实存在
  2. 大多数或所有时间的算法预测它是否是

例如,

如果数字是x,y,zi可以执行以下操作:

保存:

tmp = (x | y | z)
Run Code Online (Sandbox Code Playgroud)

当我搜索一个我可以做的数字时:

if ((num & tmp) == (num))
    do the real search
Run Code Online (Sandbox Code Playgroud)

如果数字是x,y或z,则保证在执行AND时返回num.如果不是我可能会搜索什么 - 但那基本上没问题.

这个测试的主要问题是,即使num不在组中,组i中超过5个数字的大部分时间也会变为TRUE.

我在考虑使用XOR魔法:

tmp = (x ^ y ^ z)
Run Code Online (Sandbox Code Playgroud)

当搜索时做类似的事情:

(num ^ tmp)
Run Code Online (Sandbox Code Playgroud)

但我不明白这是如何帮助我确定元素是否在组中.

有任何想法吗 ?

谢谢,

伊泰

UPDATE

我发现有用的是使用像一个非常简单的布隆过滤器:

我将x,y和z散列为位数组(例如8位).然后,我已将结果转移到正确的位:

uint8_t digest = (1 << (x % 8)) | (1 << (y % 8)) | (1 << (z % 8))
Run Code Online (Sandbox Code Playgroud)

以及我用过的搜索功能:

if ( (1 << (num % 8)) & …
Run Code Online (Sandbox Code Playgroud)

c c++ algorithm performance

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

GDB:暂时重定向目标标准输出

当我启动 GDB 时,目标进程会打印大量数据,因此我想将其重定向到 NULL 直到某个时间点。

到目前为止,我发现的唯一两种方法是:

  1. 运行 > 文件名

  2. tty 文件名

问题是我找不到将劣质的标准输出恢复正常的方法。

没有“tty default”或“default tty”

谢谢,

伊泰

linux debugging gdb stdout

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

交叉编译:检查是否可以在64位机器上构建32位

在构建C++项目时,我们有多个目标:32位和64位.

在一些64位机器上,在构建32位目标时,我们遇到了失败,因为缺少g ++ - multilib:

/usr/include/features.h:374:25: fatal error: sys/cdefs.h: No such file or directory 
Run Code Online (Sandbox Code Playgroud)

我的问题是:

根据安装的编译器和glibc包,查询当前机器是否能够生成32位映像的最佳方法是什么.

例如,一种解决方案可能是生成一个包含多个glibc包含的简单C文件,并查看我是否能够编译模拟文件.

这似乎不是优雅的解决方案.

相反,我想查询机器,看看是否安装了所有nesscary软件包.

PS:

我们使用WAF作为构建基础架构.

谢谢,

伊泰

c++ linux cross-compiling waf

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