使用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) 我有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)
谢谢.
我正在使用git跟踪一些配置文件.我通常做一个交互式,git add -p但我正在寻找一种方法来自动添加与模式匹配的所有新/修改/删除的行.否则,我需要花费很多时间来完成所有交互式拆分并添加.git add有一个模式匹配的文件名,但我找不到有关内容的任何内容.
是否有一种标准方法来编写模块以保存全局应用程序参数以包含在每个其他包中?例如:use Config;?
一个只包含our变量的简单包?那些只读变量怎么样?
我刚刚开始学习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所做的事情,我正在用另一个标签的地址创建一个单词.
我无法放置我的常量 …
如何从现有哈希创建匿名哈希?
对于数组,我使用:
@x = (1, 2, 3);
my $y = [@x];
Run Code Online (Sandbox Code Playgroud)
但我找不到如何为哈希做同样的事情:
my %x = ();
my $y = ???;
Run Code Online (Sandbox Code Playgroud)
谢谢
从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'
在严格模式下运行时,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 的调用可能会变成内联复制循环
有没有办法在编译时让 g++ 检查 C++98 语法,但同时编译时好像没有-std=给出一样?我的目标是确保我的源代码保持 C++98,但我不想阻止 g++ 使用任何更新的优化或技巧。目前,我编译了我的项目两次,一次CXXFLAGS=-std=c++98和一次最后一个空CXXFLAGS的发布。
看起来gcc 5将有-Wc90-c99-compat和-Wc99-c11-compat,那个方向的东西。
这是安全还是UB?
char x[5] = { 'a', 'b', 'c', 'd', 'e' };
printf("%5.5s\n", x);
Run Code Online (Sandbox Code Playgroud)
打印非零终止字符串的正确 printf 格式是什么?(或者打印 c 字符串的前 N 个字符的格式是什么?)
为什么constexpr部分线?我觉得它就像内联一样.什么是真正的类型f的g?
这有效:
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)
我有一个远程存储库的克隆.当我需要该存储库的另一个副本时,如果我克隆该本地克隆,则origin指向第一个克隆.所以相反,我只是cp -a first second,但这是浪费空间,因为它制作了完整的副本.git/objects.
那么,我该如何进行第二次克隆并将其保存在具有存储效率的完全相同的配置中(不,我没有运行可以使用的fs cp -a --reflink)