如果我有以下内容strlen.c:
int call_strlen(char *s) {
return __builtin_strlen(s);
}
Run Code Online (Sandbox Code Playgroud)
然后像这样用gcc和clang编译它:
gcc -c -o strlen-gcc.o strlen.c
clang -c -o strlen-clang.o strlen.c
Run Code Online (Sandbox Code Playgroud)
我很惊讶地看到strlen-clang.o包含对"strlen"的引用,而gcc预计会内联函数并且没有这样的引用.(见下面的objdumps).这是clang中的错误吗?我已经在clang编译器的几个版本中测试了它,包括3.8.
编辑:这对我来说很重要的原因是我正在链接-nostdlib,并且clang编译的版本给我一个链接错误,找不到strlen.
铛
@> objdump -d strlen-clang.o
strlen-clang.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <call_strlen>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: 48 89 7d f8 mov %rdi,-0x8(%rbp)
c: 48 8b 7d f8 mov -0x8(%rbp),%rdi
10: e8 00 00 00 00 callq 15 <call_strlen+0x15> …Run Code Online (Sandbox Code Playgroud) 我试图在Haskell中使用Data.Vector.*包做类似的事情,我真的不知道从哪里开始.我是Haskell的新手,对某些核心概念有着微妙的把握(但我已经到了那里).
我正在尝试做的事情大致可以通过以下C代码表达:
float *arrA = /* initialized to array of length n */;
float *arrB = /* initialized to array of length n */;
for (i = 1; i < n; i++) {
for (j = 0; j < n - i; j++) {
arrB[j] = someFn(i, j, arrA[j], arrB[j+1])
}
float *p = arrA;
arrA = arrB;
arrB = p;
}
return arrA[0];
Run Code Online (Sandbox Code Playgroud)
注意事项:
我们非常感谢您提供的任何帮助.
我把问题归结为一个小例子.这是我正在使用的LLVM汇编程序代码(在foo.ll中):
target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-pc-linux-gnu"
define fastcc i32 @foo(i32) {
entry:
%x = add i32 %0, 1
ret i32 %x
}
define i32 @main(i32, i8**) {
entry:
%2 = call i32 @foo(i32 %0)
ret i32 %2
}
Run Code Online (Sandbox Code Playgroud)
然后我编译:
clang -O1 -o foo foo.ll
Run Code Online (Sandbox Code Playgroud)
......当我运行它时,我得到:
Illegal instruction (core dumped)
Run Code Online (Sandbox Code Playgroud)
...所以我启动我的调试器,看到这个:
Program received signal SIGILL, Illegal instruction.
0x00000000004004d0 in main ()
(gdb) bt
#0 0x00000000004004d0 in main ()
(gdb) disas
Dump of assembler code for function main:
=> …Run Code Online (Sandbox Code Playgroud) 我正在尝试在这里构建和运行RDMA示例.但是因为我正在探索,我没有任何能够管理RDMA的硬件.当我尝试运行示例代码时,我收到这样的错误.
librdmacm: couldn't read ABI version.
librdmacm: assuming: 4
CMA: unable to get RDMA device list
error: ec = rdma_create_event_channel() failed (returned zero/null).
Run Code Online (Sandbox Code Playgroud)
是否有可用于开发的RDMA功能的"本地"实现?我知道RDMA中的"R"意味着远程,但我认为这可能存在用于测试/开发目的.
作为参考,我的Ubuntu 14.04箱尝试这个已经安装的软件包libibverbs-dev,并librdmacm-dev为了让代码编译.
当我尝试编译时:
module Main where
import qualified Data.Vector.Unboxed.Mutable as MV
import Control.Monad.ST
myRead mv = runST $ MV.read mv 0
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
Could not deduce (t ~ U.MVector s a)
from the context (U.Unbox a)
bound by the inferred type of myRead :: U.Unbox a => t -> a
at src/Main.hs:53:1-32
`t' is a rigid type variable bound by
the inferred type of myRead :: U.Unbox a => t -> a
at src/Main.hs:53:1
Expected type: U.MVector (PrimState (ST s)) a
Actual type: …Run Code Online (Sandbox Code Playgroud) 我有一个用C编写的简单服务器.它的主要目的是通过专有协议与一些业务合作伙伴进行通信.出于这个原因和其他一些原因,它必须用C语言编写.我有许多其他的过程,但是,用其他语言(例如Python)编写,必须与服务器通信(本地,在同一个Linux服务器上).
在这种情况下,跨语言IPC的最佳选择是什么?具体来说,我认为我掌握了传输技术:Unix域套接字,命名管道,共享内存,ZeroMQ(Crossroads).我对实现协议的最佳方式更感兴趣,以保持C代码的小型和可维护性,同时仍然允许来自其他语言的通信.
编辑:似乎有些混乱.我对讨论域套接字,共享内存等的优缺点不感兴趣.人.我很感兴趣的msgpack(感谢开卷),以及其他技术实现有线协议/办法.
我在MsgPack C头文件中看到了对"zone"的引用,但是找不到它是什么或它的用途的文档.它是什么?此外,C API的功能文档在哪里?
我有一个用C/C++编写的多线程服务器进程,我试图用Google perftools进行分析.但是,当我使用perftools运行该进程时,很快我的服务器因"syscall interrupt"错误而停止,我认为这是由传入的SIGPROF引起的.(正在被中断的实际系统调用深入到我对zmq_recv的调用中,但我认为它不是真正重要的.)
这是预期的行为吗?我应该以某种方式明确处理这个案子吗?或者这里出了什么问题?
我有一个在Compute Engine实例上运行的服务器,它向AppEngine应用程序发出请求(在同一API项目中,FWIW).我是否对从AppEngine应用程序流出的数据收取"传出带宽"的费用?
实现需要等待异构事件集的服务器主循环的普遍接受的方法是什么?这是服务器应该等待(不忙等),直到出现以下情况之一: