小编bro*_*s94的帖子

在Clang建造的不是那么内置?

如果我有以下内容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)

c gcc clang

9
推荐指数
2
解决办法
1237
查看次数

不知道从哪里开始使用可变向量

我试图在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)

注意事项:

  • 出于性能原因重用数组,但我需要其中两个来避免践踏下一次迭代所需的值
  • 数组被交换
  • 内循环的上界随外循环的每次迭代而变化

我们非常感谢您提供的任何帮助.

haskell

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

Clang用非法指令生成可执行文件

我把问题归结为一个小例子.这是我正在使用的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)

llvm clang

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

"本地"RDMA用于开发

我正在尝试在这里构建和运行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为了让代码编译.

c rdma infiniband

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

Haskell:使用runST"无法推断"错误

当我尝试编译时:

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)

haskell

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

简单的线协议,什么人做?

我有一个用C编写的简单服务器.它的主要目的是通过专有协议与一些业务合作伙伴进行通信.出于这个原因和其他一些原因,它必须用C语言编写.我有许多其他的过程,但是,用其他语言(例如Python)编写,必须与服务器通信(本地,在同一个Linux服务器上).

在这种情况下,跨语言IPC的最佳选择是什么?具体来说,我认为我掌握了传输技术:Unix域套接字,命名管道,共享内存,ZeroMQ(Crossroads).我对实现协议的最佳方式更感兴趣,以保持C代码的小型和可维护性,同时仍然允许来自其他语言的通信.

编辑:似乎有些混乱.我对讨论域套接字,共享内存等的优缺点感兴趣.人.我感兴趣的msgpack(感谢开卷),以及其他技术实现有线协议/办法.

c linux ipc zeromq

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

什么是MsgPack'区域'

我在MsgPack C头文件中看到了对"zone"的引用,但是找不到它是什么或它的用途的文档.它是什么?此外,C API的功能文档在哪里?

c msgpack

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

使用谷歌perftools时,SIGPROF会杀死我的服务器

我有一个用C/C++编写的多线程服务器进程,我试图用Google perftools进行分析.但是,当我使用perftools运行该进程时,很快我的服务器因"syscall interrupt"错误而停止,我认为这是由传入的SIGPROF引起的.(正在被中断的实际系统调用深入到我对zmq_recv的调用中,但我认为它不是真正重要的.)

这是预期的行为吗?我应该以某种方式明确处理这个案子吗?或者这里出了什么问题?

c c++ linux signals google-perftools

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

我是否对AppEngine应用和Compute Engine实例之间的带宽收费?

我有一个在Compute Engine实例上运行的服务器,它向AppEngine应用程序发出请求(在同一API项目中,FWIW).我是否对从AppEngine应用程序流出的数据收取"传出带宽"的费用?

google-app-engine google-compute-engine

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

在Haskell中实现主服务器循环?

实现需要等待异构事件集的服务器主循环的普遍接受的方法是什么?这是服务器应该等待(不忙等),直到出现以下情况之一:

  • 新的套接字连接
  • 现有套接字上可用的数据
  • OS信号
  • 第三方库回调

haskell

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