Tag: 铿锵

在C中,无符号和有符号字符指针之间的转换何时变得不安全?

如果我在clang和Visual Studio中都这样做: unsigned char *a = 0; char * b = 0; char x = ‘3’; a = & x; b = (unsigned char*) a; 我收到警告,我正在尝试在有符号和无符号字符指针之间进行转换,但代码确实有效。 虽然编译器说这是有原因的。 你能指出一个可能变成问题的情况吗?

从当前目录以外的目录中包含C代码的正确方法

我有两个目录, sorting和searching (同一目录的孩子),有.c源文件和.h头文件: mbp:c $ ls sorting array_tools.c bubble_sort.c insertion_sort.c main selection_sort.c array_tools.h bubble_sort.h insertion_sort.h main.c selection_sort.h mbp:c $ ls searching array_tools.c array_tools.h binary_search.c binary_search.h linear_search.c linear_search.h main main.c 在searching ,我正在构建一个需要使用insertion_sort函数的可执行文件,在insertion_sort.h声明并在insertion_sort.h定义。 以下编译成功生成可执行文件: mbp:searching $ clang -Wall -pedantic -g -iquote”../sorting” -o main main.c array_tools.c binary_search.c linear_search.c ../sorting/insertion_sort.c 但是,我希望能够通过使用#include包含标头然后为编译器提供搜索路径来包含来自任意目录的函数。 我是否需要预先将.c文件预编译为.o文件? clang的man页列出了以下选项: -I Add the specified directory to […]

铿锵声中的静态预计算优化

我有 #include #include #include #include #include int fib(int n) { return n < 2 ? n : fib(n-1) + fib(n-2); } double clock_now() { struct timeval now; gettimeofday(&now, NULL); return (double)now.tv_sec + (double)now.tv_usec/1.0e6; } #define NITER 5 在我的main() ,我正在做一个像这样的简单基准: printf(“hi\n”); double t = clock_now(); int f = 0; double tmin = INFINITY; for (int i=0; […]

Clang互惠1次优化

在与同事讨论之后,我最终测试了是否clang如果将两个分区(相当于1)优化为单个分​​区。 const float x = a / b; //x not used elsewhere const float y = 1 / x; 理论上clang可以优化到const float y = b / a如果x仅用作临时步长值,不是吗? 这是一个简单测试用例的输入和输出: https : //gist.github.com/Jiboo/d6e839084841d39e5ab6 (在两个输出中你可以看到它正在执行两个部分,而不是优化) 这个相关的问题是我理解的背后,似乎只关注为什么没有使用特定的指令,而在我的情况下,它是未完成的优化: 为什么GCC或Clang在快速使用时不能优化1指令的倒数-数学 谢谢,JB。

-O2将printf(“%s \ n”,str)优化为puts(str)

用clang玩弄,我编译了一个包含这一行的C程序: printf(“%s\n”, argv[0]); 在没有优化的情况下进行编译时,在设置寄存器后,程序集输出称为printf : movq (%rcx), %rsi movq %rax, %rdi movb $0, %al callq _printf 我尝试使用clang -O2编译。 printf调用被替换为puts调用: movq (%rsi), %rdi callq _puts 虽然这在这种情况下非常有意义,但它提出了两个问题: 在优化编译中,函数调用替换的频率是多少? 这是频繁的还是stdio是个例外? 我可以为自己的库编写编译器优化吗? 我该怎么办?

在C中使用ASM命令

关于在c中使用ASM,我有一个小问题。 我想执行指令: LDR PC,=0x123456 这给了我错误“操作数中的意外令牌”。 asm(“LDR PC,=0x123456”); 这给出了“无效约束”。 asm(“LDR PC,” : “m” (0x123456)); 这样做的正确方法是什么?

Clang使用-nostdlib生成崩溃代码

我正在为可执行文件设置我自己的运行时环境,我不能得到clang(v3.4-1ubuntu1,target:x86_64-pc-linux-gnu)来生成一个不会发生段错误的可执行文件。 我已将问题减少到以下几点: 如果我有一个文件crt1.c除了满足_start符号的链接器要求之外什么都不做: void _start(char *arguments, …) { } 然后我用clang -nostdlib crt1.c编译它,它产生以下可执行文件(来自objdump -d a.out ): a.out: file format elf64-x86-64 Disassembly of section .text: 0000000000400150 : 400150: 55 push %rbp 400151: 48 89 e5 mov %rsp,%rbp 400154: 48 81 ec f0 00 00 00 sub $0xf0,%rsp 40015b: 84 c0 test %al,%al 40015d: 0f 29 bd 30 […]

从sockaddr *转换为sockaddr_in *增加了所需的对齐

当我使用一些看起来像的代码时,编译器会产生这个警告。 …. for(p = res; p != NULL; p = p->ai_next) { void *addr; std::string ipVer = “IPv0”; if(p->ai_family == AF_INET) { ipVer = “IPv4”; struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; addr = &(ipv4->sin_addr); } else { ipVer = “IPv6”; struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr; addr = &(ipv6->sin6_addr); } …. } 其中p […]

clang和gcc之间的区别

我在不同的项目中使用了这两个编译器。 它们在代码处理和输出生成方面有何不同? 例如, gcc和clang都有-O2选项用于优化。 它们在优化代码方面是否以相同的方式运行(高级别)? 我做了一点测试,例如,如果我有以下代码: int foo(int num) { if(num % 2 == 1) return num * num; else return num * num +1; } 以下是带有-ng的clang和gcc的输出程序集: —-gcc 5.3.0—– —-clang 3.8.0—- foo(int): foo(int): movl %edi, %edx movl %edi, %eax shrl $31, %edx shrl $31, %eax leal (%rdi,%rdx), %eax addl %edi, %eax andl $1, %eax andl […]

C中的primefaces读数

根据Are C ++读取和写入int Atomic? ,由于处理器缓存的问题,int的读取(以及因此指针 – 或者我认为)在C中不是primefaces的。所以,我的问题是是否有一些我可以用来制作读取primefaces的汇编,或者我需要使用锁吗? 我查看了几组primefaces操作库,到目前为止,我无法找到primefaces读取的函数。 编辑:编译器: Clang 2.9 编辑:平台: x86(64位) 谢谢。