小编Rer*_*umu的帖子

为什么C ++的初始分配比C大得多?

当使用相同的代码时,只需更改编译器(从C编译器到C ++编译器)将更改分配的内存量。我不太确定为什么会这样,并且想进一步了解。到目前为止,我得到的最好的答复是“可能是I / O流”,它的描述性不是很强,这使我对C ++的“不用付钱,不用付钱”感到好奇。

我正在使用分别为7.0.1-8和8.3.0-6的Clang和GCC编译器。我的系统在最新的Debian 10(Buster)上运行。基准通过Valgrind Massif完成。

#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所使用的代码不会更改,但是无论我是以C还是C ++进行编译,它都会更改Valgrind基准测试的结果。但是,这些值在编译器之间保持一致。该程序的运行时分配(峰值)如下:

  • GCC(C):1,032字节(1 KB)
  • G ++(C ++):73,744字节(〜74 KB)
  • lang(C):1,032字节(1 KB)
  • Clang ++(C ++):73,744字节(〜74 KB)

为了进行编译,我使用以下命令:

clang -O3 -o c-clang ./main.c
gcc -O3 -o c-gcc ./main.c
Run Code Online (Sandbox Code Playgroud)
clang++ -O3 -o cpp-clang ./main.cpp
g++ -O3 -o cpp-gcc ./main.cpp
Run Code Online (Sandbox Code Playgroud)

对于Valgrind,我运行valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang每种编译器和语言,然后ms_print显示峰。

我在这里做错什么了吗?

c c++ benchmarking

135
推荐指数
2
解决办法
7716
查看次数

“使用”语句中的自/循环引用

我曾尝试在程序中为动态变量定义变量类型,但似乎无法使它存储将其返回为类型的函数。

using Value = std::variant<Integer, Float, Function>;
using Function = std::function<Value()>;
Run Code Online (Sandbox Code Playgroud)

由于Function需要在当时定义,因此不会编译Value,但也Function取决于它Value。我尝试通过将Function类型内联到变量模板列表中来解决此问题,但似乎using语句无法引用自身或进行正向声明。

到目前为止,我最好的解决方案是将其定义Function为结构,以便我可以对其进行声明。这行得通,但似乎太笨拙了,所以我想知道是否有更好的方法?

struct Function;
// define Value
struct Function : std::function<Value()> {};
Run Code Online (Sandbox Code Playgroud)

为了阐明这一点,它std::function被用作示例的一部分,因为我认为这样可以更轻松地展示我正在尝试做的事情,而对于我的hacky解决方案来说,这也是需要的。如果可能的话,我更希望有一种使用普通函数指针的方法。

c++ forward-declaration

7
推荐指数
1
解决办法
93
查看次数

标签 统计

c++ ×2

benchmarking ×1

c ×1

forward-declaration ×1