Skip to content

Instantly share code, notes, and snippets.

@fritz0705
Created April 16, 2013 21:26
Show Gist options
  • Save fritz0705/5399782 to your computer and use it in GitHub Desktop.
Save fritz0705/5399782 to your computer and use it in GitHub Desktop.
// -fstrict-aliasing -Wall -Wextra -Werror -pedantic -std=c99
#include <string.h>
#include <stdio.h>
#define ARRAY_COPY(dst, src, len) {\
struct {\
struct {\
char __[len];\
} *__s, *__d;\
} __cp = { .__s = (void*)(src), .__d = (void*)(dst) };\
*(__cp.__d) = *(__cp.__s);\
}
void s1() __attribute__((optimize(2)));
void s1()
{
int src[10] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
int *dst = src + 2;
ARRAY_COPY(dst, src, sizeof(int)*8);
printf("%d %d %d %d %d %d %d %d %d %d\n", src[0], src[1], src[2], src[3],
src[4], src[5], src[6], src[7], src[8], src[9]);
}
void s2() __attribute__((optimize(0)));
void s2()
{
int src[10] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
int *dst = src + 2;
ARRAY_COPY(dst, src, sizeof(int)*8);
printf("%d %d %d %d %d %d %d %d %d %d\n", src[0], src[1], src[2], src[3],
src[4], src[5], src[6], src[7], src[8], src[9]);
}
void s3() __attribute__((optimize(3)));
void s3()
{
int src[10] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
int *dst = src + 2;
memmove(dst, src, sizeof(int)*8);
printf("%d %d %d %d %d %d %d %d %d %d\n", src[0], src[1], src[2], src[3],
src[4], src[5], src[6], src[7], src[8], src[9]);
}
int main(int argc, char **argv)
{
(void) argc;
(void) argv;
s1();
s2();
s3();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment