小编Ben*_*oît的帖子

为什么GCC在不使用结果的情况下调用libc的sqrt()?

使用GCC 6.3,以下C++代码:

#include <cmath>
#include <iostream>

void norm(double r, double i)
{
    double n = std::sqrt(r * r + i * i);
    std::cout << "norm = " << n;
}
Run Code Online (Sandbox Code Playgroud)

生成以下x86-64程序集:

norm(double, double):
        mulsd   %xmm1, %xmm1
        subq    $24, %rsp
        mulsd   %xmm0, %xmm0
        addsd   %xmm1, %xmm0
        pxor    %xmm1, %xmm1
        ucomisd %xmm0, %xmm1
        sqrtsd  %xmm0, %xmm2
        movsd   %xmm2, 8(%rsp)
        jbe     .L2
        call    sqrt
.L2:
        movl    std::cout, %edi
        movl    $7, %edx
        movl    $.LC1, %esi
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gcc x86-64

56
推荐指数
1
解决办法
3106
查看次数

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

如何在点中控制子图的布局?

我有digraph许多独立和简单subgraphs的各种尺寸.dot水平放置所有这些子图,所以我最终得到一个40000x200输出文件,例如:

G1 G2 G3 G.....4 G5
Run Code Online (Sandbox Code Playgroud)

我如何告诉dot在两个维度中布局这些子图以获得类似的东西:

G1 G2 G3
G.....4
G5
Run Code Online (Sandbox Code Playgroud)

谢谢.

dot graphviz

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

我如何git只添加与模式匹配的行?

我正在使用git跟踪一些配置文件.我通常做一个交互式,git add -p但我正在寻找一种方法来自动添加与模式匹配的所有新/修改/删除的行.否则,我需要花费很多时间来完成所有交互式拆分并添加.git add有一个模式匹配的文件名,但我找不到有关内容的任何内容.

git git-add

30
推荐指数
2
解决办法
2830
查看次数

如何在Perl中的不同包之间共享全局值?

是否有一种标准方法来编写模块以保存全局应用程序参数以包含在每个其他包中?例如:use Config;

一个只包含our变量的简单包?那些只读变量怎么样?

perl global-variables

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

为什么GNU在x86和ARM之间的语法不同?

我刚刚开始学习ARM程序集,我不明白为什么GNU as语法与x86*不同.

由于指令是相同的,我会期望一切都像x86*,除了指令本身,但相反,我正在努力加载字符串的地址,等等.我从头开始通过在线阅读一些PDF ,man 2 syscall并反编译基本的例子,因为我不确定我可以在网上找到的各种Hello World的价值.

我的问题:

  • 寄存器不需要%印记
  • 整数常量可以有一个#或一个$sigil.事实上,如果我编译mov r0, $0,objdump -D给我一个回复mov r0, #1.

一切都汇集到了同样的东西mov r0, #1:

        mov %r0, $1
   10080:       e3a00001        mov     r0, #1
        mov r0, $1
   10084:       e3a00001        mov     r0, #1
        mov %r0, #1
   10088:       e3a00001        mov     r0, #1
        mov r0, #1
   1008c:       e3a00001        mov     r0, #1
Run Code Online (Sandbox Code Playgroud)
  • 我无法直接使用标签的地址来加载字符串地址,所以我需要使用一个变量.mov r1, $hello或者ldr r1, $hello不工作.在x86_64中,我会写的mov $hello, %rsi.所以我正在做gcc所做的事情,我正在用另一个标签的地址创建一个单词.

  • 我无法放置我的常量 …

assembly arm gnu-assembler att

6
推荐指数
2
解决办法
1712
查看次数

如何从Perl中的现有哈希创建匿名哈希?

如何从现有哈希创建匿名哈希?

对于数组,我使用:

@x = (1, 2, 3);
my $y = [@x];
Run Code Online (Sandbox Code Playgroud)

但我找不到如何为哈希做同样的事情:

my %x = ();
my $y = ???;
Run Code Online (Sandbox Code Playgroud)

谢谢

perl hash reference

5
推荐指数
3
解决办法
2013
查看次数

为什么std :: apply失败了泛型函数?

cppreference中获取,为什么调用std::apply(add_generic, ...)无法编译?有办法解决吗?

#include <iostream>
#include <tuple>

int add(int first, int second)
{
    return first + second;    
}

template<typename T>
T add_generic(T first, T second)
{
    return first + second;    
}

int main()
{
    std::cout << std::apply(add, std::make_tuple(1,2)) << '\n';

    // template argument deduction/substitution fails
    std::cout << std::apply(add_generic, std::make_tuple(2.0f,3.0f)) << '\n'; 
}
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

[x86-64 gcc 7(快照)]错误:没有匹配函数调用'apply(,std :: tuple)'[x86-64 gcc 7(快照)]注意:无法推导出模板参数'_Fn'

c++ c++17

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

为什么 GCC 在严格模式下不使用内置函数?

在严格模式下运行时,GCC会禁用许多内置函数-std=c...

在严格的 ISO C 模式(-ansi、-std=c90、-std=c99 或 -std=c11)之外,函数 _exit、alloca、bcmp、bzero ... stpcpy、... 可以作为内置函数处理。所有这些函数都有相应的带有_builtin前缀的版本,即使在严格的 C90 模式下也可以使用。

有什么理由吗?内置函数不符合要求吗?或者这是因为标准说当你调用memcpy它时应该实际调用它并且 i 不能被优化掉?

我觉得如果我使用它重新编译它,我的代码肯定可以运行得更快,-std=gnu*因为它可以实现更多优化

GCC 通常会生成特殊代码来更有效地处理某些内置函数;例如,对 alloca 的调用可能会变成直接调整堆栈的单个指令,而对 memcpy 的调用可能会变成内联复制循环

optimization gcc

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

g++ 标志只检查语法?

有没有办法在编译时让 g++ 检查 C++98 语法,但同时编译时好像没有-std=给出一样?我的目标是确保我的源代码保持 C++98,但我不想阻止 g++ 使用任何更新的优化或技巧。目前,我编译了我的项目两次,一次CXXFLAGS=-std=c++98和一次最后一个空CXXFLAGS的发布。

看起来gcc 5将有-Wc90-c99-compat-Wc99-c11-compat,那个方向的东西。

c++ g++ c++11 c++98

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

固定字符串的 printf 格式是什么?

这是安全还是UB?

char x[5] = { 'a', 'b', 'c', 'd', 'e' };
printf("%5.5s\n", x);
Run Code Online (Sandbox Code Playgroud)

打印非零终止字符串的正确 printf 格式是什么?(或者打印 c 字符串的前 N ​​个字符的格式是什么?)

c printf

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

为什么constexpr是该类型的一部分?

为什么constexpr部分线?我觉得它就像内联一样.什么是真正的类型fg

这有效:

void f()
{
  auto f = []() { return 42; };
  auto p = f;

  static_assert(std::is_same_v<decltype(f), decltype(p)>);
}
Run Code Online (Sandbox Code Playgroud)

但这不是:

void g()
{
  constexpr auto f = []() { return 42; };
  auto p = f;

  static_assert(std::is_same_v<decltype(f), decltype(p)>);
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/g/Di4SJ5

c++ const constexpr c++11

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

存储有效的git克隆

我有一个远程存储库的克隆.当我需要该存储库的另一个副本时,如果我克隆该本地克隆,则origin指向第一个克隆.所以相反,我只是cp -a first second,但这是浪费空间,因为它制作了完整的副本.git/objects.

那么,我该如何进行第二次克隆并将其保存在具有存储效率的完全相同的配置中(不,我没有运行可以使用的fs cp -a --reflink)

git object repository

0
推荐指数
1
解决办法
118
查看次数