a bullet with your name, a ticking time grenade

ephemeral_1986 2016-09-27 05:37:41

1 #include <stdio.h>
2 #include <time.h>
3
4
5 #define GCC_ASM __asm__ __volatile__
6
7
8
9 void swap_pointer(int *a, int *b)
10 {
11 GCC_ASM(
12 /*save registes's value which i want use to stack*/
13 "mov %%rax, -0x30(%%rbp)\n\t"
14 "mov %%rbx, -0x28(%%rbp)\n\t"
15 "mov %%rcx,-0x20(%%rbp)\n\t"
16
17 /*do the swap stuff*/
18 "mov %0,%%rax\n\t"
19 "mov %1,%%rbx\n\t"
20 "mov (%%rax),%%ecx\n\t"
21 "xchg (%%rbx), %%ecx\n\t"
22 "mov %%ecx,(%%rax)\n\t"
23
24 /*after finish swap,restore used registers*/
25 "mov -0x30(%%rbp), %%rax\n\t"
26 "mov -0x28(%%rbp), %%rbx\n\t"
27 "mov -0x20(%%rbp), %%rcx\n\t"
28 :
29 :"m"(a),"m"(b));
30 return;
31 }
32
33
34
35
36 void swap_pointer_v3(int *a, int *b)
37 {
38 int c = *a;
39 *a = *b;
40 *b = c;
41 return;
42 }
43
44
45 #define swap_pointer_v2(a, b) ({\
46 int _a = *a; \
47 *a = *b; \
48 *b = _a;\
49 })
50
51
52
53
54 int main(int argc, char **argv)
55 {
56 int a = 10;
57 int b = 20;
58 unsigned i = 0;
59
60 clock_t start = clock();
61 for(i = 0; i < 0xFFFFFFU; ++i)
62 {
63 swap_pointer(&a, &b);
64 }
65 clock_t end = clock();
66 printf("inline asm swap_pointer tick:%d\n", end - start);
67
68 start = clock();
69 for(i = 0; i < 0xFFFFFFU; ++i)
70 {
71 swap_pointer_v3(&a, &b);
72 }
73 end = clock();
74 printf("regular swap_pointer tick:%d\n", end - start);
75
76
77 start = clock();
78 for(i = 0; i < 0xFFFFFFU; ++i)
79 {
80 swap_pointer_v2(&a, &b);
81 }
82 end = clock();
83 printf("macro swap_pointer tick:%d\n", end - start);
84 return 0;
85 }
86





[root@localhost assemble]# ./a.out
inline asm swap_pointer tick:200000
regular swap_pointer tick:80000
macro swap_pointer tick:30000

...全文
368 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-09-28
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0)
char   *p1="1" ,*p2="2" ;
char    c1=1   , c2=2   ;
short   s1=1   , s2=2   ;
int     i1=1   , i2=2   ;
__int64 I1=1i64, I2=2i64;
float   f1=1.0f, f2=2.0f;
double  d1=1.0 , d2=2.0 ;
void main() {
    SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);
    SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);
    SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);
    SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);
    SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);
    SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);
    SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);

    SWAP(c1,c1);
    printf("%d\n",c1);
}
//char *         2,       1
//char           2,       1
//short          2,       1
//int            2,       1
//__int64     2,    1
//float          2,       1
//double        2,      1
//2

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧