我用C编写了简单的函数, void GetInput() { char buffer[8]; gets(buffer); puts(buffer); } 当我在gdb的反汇编程序中对它进行反汇编时,它会进行以下反汇编。 0x08048464 : push %ebp 0x08048465 : mov %esp,%ebp 0x08048467 : sub $0x10,%esp 0x0804846a : mov %gs:0x14,%eax 0x08048470 : mov %eax,-0x4(%ebp) 0x08048473 : xor %eax,%eax => 0x08048475 : lea -0xc(%ebp),%eax 0x08048478 : mov %eax,(%esp) 0x0804847b : call 0x8048360 0x08048480 : lea -0xc(%ebp),%eax 0x08048483 : mov %eax,(%esp) […]
我试图将一个循环转换为SSE内在函数。 我似乎已经取得了相当不错的进展,而且我的意思是它是在正确的方向但是我似乎在某处做了一些错误的翻译,因为我没有得到非sse代码导致的相同的“正确”答案。 我以4倍展开的原始循环如下所示: int unroll_n = (N/4)*4; for (int j = 0; j < unroll_n; j++) { for (int i = 0; i < unroll_n; i+=4) { float rx = x[j] – x[i]; float ry = y[j] – y[i]; float rz = z[j] – z[i]; float r2 = rx*rx + ry*ry + rz*rz + eps; […]
我正在寻找一种以快速便携(IEEE 754)方式将float截断为int方法。 原因是因为在这个函数中,50%的时间都花在了演员身上: float fm_sinf(float x) { const float a = 0.00735246819687011731341356165096815f; const float b = -0.16528911397014738207016302002888890f; const float c = 0.99969198629596757779830113868360584f; float r, x2; int k; /* bring x in range */ k = (int) (F_1_PI * x + copysignf(0.5f, x)); /* <– 50% of time is spent in cast */ x -= k […]
如果我从不使用静态const变量的地址,那么在使用合理的现代编译器时是否为它分配了内存?
在为gcc编译器的-O2优化运行一些测试时,我在函数的反汇编代码中观察到以下指令: data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 这个指令做了什么? 为了更详细,我试图了解编译器如何使用O2优化优化无用的递归,如下所示: int foo(void) { return foo(); } int main (void) { return foo(); } 上面的代码在没有优化的情况下编译时导致堆栈溢出,但适用于O2优化代码。 我认为使用O2它完全删除了推送函数foo的堆栈,但为什么data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)需要? 0000000000400480 : foo(): 400480: eb fe jmp 400480 400482: 66 66 66 66 66 2e 0f data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 400489: 1f 84 00 […]
任何人都可以帮助我优化代码来读取标准输入。 这就是我现在拥有的: unsigned char *msg; size_t msgBytes = 0; size_t inputMsgBuffLen = 1024; if ( (msg = (unsigned char *) malloc(sizeof(unsigned char) * inputMsgBuffLen) ) == NULL ) { quitErr(“Couldn’t allocate memmory!”, EXIT_FAILURE); } for (int c; (c = getchar()) != EOF; msgBytes++) { if (msgBytes >= (inputMsgBuffLen)) { inputMsgBuffLen <<= 1; if ( ( […]
嗨我正在为嵌入式系统实现一些定点数学的东西,我试图将两个16.16定点数相乘,而不创建64位临时数。 到目前为止,我提出的代码生成的指令最少。 int multiply(int x, int y){ int result; long long temp = x; temp *= y; temp >>= 16; result = temp; return result; } 这段代码的问题在于它使用了一个临时的64位整数,这似乎会产生错误的汇编代码。 我正在尝试使用两个32位整数而不是64位整数的系统。 有人知道怎么做吗?
我需要非常频繁地从java计算Math.exp() ,是否有可能让本机版本比java的Math.exp()更快地运行? 我只尝试了jni + C,但它比普通的java慢。
假设我有: double f(const double *r) { return 0*(r[0]*r[1]); } 如果值可能是inf或nan,编译器是否应该能够优化分段,还是必须执行操作? gcc -O3 -S test.c: .file “test.c” .text .p2align 4,,15 .globl f .type f, @function f: .LFB0: .cfi_startproc movsd (%rdi), %xmm0 mulsd 8(%rdi), %xmm0 mulsd .LC0(%rip), %xmm0 ret .cfi_endproc .LFE0: .size f, .-f .section .rodata.cst8,”aM”,@progbits,8 .align 8 .LC0: .long 0 .long 0 .ident “GCC: (Ubuntu 4.4.3-4ubuntu5) […]
我知道内核使用了likely , unlikely宏。 宏的文档位于内置函数:long __builtin_expect(long exp,long c) 。 但他们并没有真正讨论细节。 编译器究竟如何处理likely(x)和__builtin_expect((x),1) ? 它是由代码生成器还是优化器处理的? 它取决于优化级别吗? 代码生成的示例是什么?