小编Jus*_* L.的帖子

在C++中清除printf size_t的代码(或者:C++中C99的%z的最近等价物)

我有一些C++代码打印出size_t:

size_t a;
printf("%lu", a);
Run Code Online (Sandbox Code Playgroud)

我希望在32位和64位架构上编译时不会发出警告.

如果这是C99,我可以使用printf("%z", a);.但是AFAICT %z在任何标准C++方言中都不存在.所以相反,我必须这样做

printf("%lu", (unsigned long) a);
Run Code Online (Sandbox Code Playgroud)

这真的很难看.

如果没有size_t内置于该语言中的打印功能,我想知道是否可以编写一个printf包装器或类似的东西,这样可以在size_ts 上插入适当的强制转换,以便在保持好的编译器警告的同时消除虚假的编译器警告.

有任何想法吗?


编辑为了澄清为什么我使用printf:我有一个相对较大的代码库,我正在清理.它使用printf包装器来执行诸如"编写警告,将其记录到文件以及可能退出错误的代码"之类的操作.我可能能够用cout包装器来运行足够的C++ - foo,但是我不想改变程序中的每个warn()调用,只是为了摆脱一些编译器警告.

c++ printf size-t

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

防止GDB进入函数(或文件)

我有一些这样的C++代码,我正在使用GDB:

void foo(int num) { ... }

void main() {
  Baz baz;
  foo (baz.get());
}
Run Code Online (Sandbox Code Playgroud)

当我进去时main(),我想介入foo(),但我想要跳过去 baz.get().

GDB文档说,"如果有一个函数行号信息的步骤命令只进入功能",所以我会很高兴,如果我能删除行号信息,baz.get()从我的可执行文件.但理想情况下,我可以告诉GDB"永远不会进入Baz类的任何功能".

有谁知道如何做到这一点?

gdb

25
推荐指数
2
解决办法
6969
查看次数

为什么C++编译器不会在继承的公共和具有相同名称的继承私有方法之间消除歧义?

我很困惑为什么C++编译器不会接受这个:

  class Foo { 
    private: void Baz() { }
  };

  class Bar {
    public: void Baz() { 
  };

  class FooBar : public Foo, public Bar { };

  void main() {
    FooBar fb;
    fb.Baz();
  }
Run Code Online (Sandbox Code Playgroud)

gcc给出的错误是:

 request for member ‘Baz’ is ambiguous
 candidates are: void Bar::Baz()
                 void Foo::Baz()
Run Code Online (Sandbox Code Playgroud)

但是我想要Bar :: Baz()并不明显,因为Foo :: Baz()是私有的吗?为什么编译器不会在这里消除歧义?

c++ inheritance multiple-inheritance

6
推荐指数
1
解决办法
398
查看次数

如何强制 MacOS 释放 MADV_FREE 的页面?

我的程序有一个自定义分配器,它使用mmap(MAP_ANON | MAP_PRIVATE). 当它不再需要内存时,分配器调用munmapmadvise(MADV_FREE)MADV_FREE保持映射,但告诉操作系统它可以丢弃与映射关联的物理页面。

调用MADV_FREE您最终将再次需要的页面比调用munmap然后mmap再次调用要快得多。

这对我来说几乎完美。唯一的问题是,在 MacOS 上,MADV_FREE 对于摆脱我要求它释放的页面非常懒惰。事实上,只有当另一个应用程序有内存压力时,它才会摆脱它们。在它清除我释放的页面之前,MacOS 报告我的程序仍在使用该内存;在活动监视器中,它的“真实内存”列不反映释放的内存。

这使我很难衡量我的程序实际使用了多少内存。(测量 RSS 的难度使我们无法在 10.5 上登陆自定义分配器。)

我可以分配一大堆内存来强制操作系统释放这些页面,但除了花费很长时间之外,这可能会产生其他副作用,例如导致我的程序的一部分被分页到磁盘。

在百灵鸟上,我尝试了该purge命令,但没有任何效果。

如何强制 MacOS 清除这些 MADV_FREE 页面?或者,我如何询问 MacOS 我的进程在内存中有多少 MADV_FREE 页面?

这是一个测试程序,如果有帮助的话。程序进入睡眠状态后,活动监视器的“真实内存”列显示为 512MB。在我的 Linux 机器上,top 根据需要显示 256MB 的 RSS。

#include <sys/mman.h>
#include <stdio.h>
#include <unistd.h>

#define SIZE (512 * 1024 * 1024)

// We use MADV_FREE on Mac and MADV_DONTNEED on Linux.
#ifndef MADV_FREE
#define MADV_FREE MADV_DONTNEED
#endif

int …
Run Code Online (Sandbox Code Playgroud)

macos memory-management

6
推荐指数
1
解决办法
1346
查看次数

让GDB显示整个多行语句

GDB,至少在我的Ubuntu 9.04盒子上默认配置,不能很好地处理多行语句.当我逐步执行代码时,GDB只显示当前语句的最后一行,即使该语句跨越多行.

我知道我可以使用DDD或emacs作为GDB的前端,但我更愿意在GDB中解决这个问题,如果可能的话.

有谁知道是否有办法让GDB在这里做正确的事情?

gdb

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

可以显示原始样品计数吗?

我想PERF到输出的原始样本数,而不是百分比.这对于确定我是否加快了我正在尝试优化的功能非常有用.

要清楚,我想做点什么

perf record ./a.out
perf report
Run Code Online (Sandbox Code Playgroud)

并查看在a.out中对每个函数进行多少次采样.

Shark可以在Mac上做到这一点,我相信Xperf.这是否可以在Linux上使用perf?

linux profiling

5
推荐指数
1
解决办法
1261
查看次数