This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: vector of aligned elements


Hi Ho!

--- On Fri, 6/20/08, "massimiliano cialdi" <cialdi@gmail.com> wrote:

> is possoble to declare an array of element aligned?

Yes, it is.

> for example is possible to declare an array of long aligned to 8 byte,
> so as if &array[0] is x then &array[1] is x+MAX(8,sizeof(long))

Yes, it is.

> I tried the following
>
> #include <stdio.h>
>
> typedef long aligned_long __attribute__ ((aligned (32)));
>
> aligned_long a[4];
>
> int main(void)
> {
>     printf("test %d\n", sizeof(a));
>     return 0;
> }
>
> compiled with the following command line
> gcc -Wall main.c -o main
> (gcc 4.2.1)
>
> I obtain this error
> error: alignment of array elements is greater than element size
>
>
> So is it impossible or is there another way?

The following one should work:

typedef union {
	long value;
	char alignment [32];
} aligned_long;

> this is not the real problem, I simply try to answer to the following question:
> can I assume that (&array[1]-&array[0])==sizeof(array[0])?

You mean: ((int) &array[1] - (int) &array[0]) == sizeof (array[0])? It is because &array[1]-&array[0] will always give you 1 since it is a pointer arithmetic operation.

If so, yes, I think you can assume that because sizeof() also takes into account the alignment, for example,

struct x {
	char a;
	int b;
};

sizeof(x) == 8

struct x array[2];

sizeof(array) == 16.

So, ((int) &array[1] - (int) &array[0]) == sizeof (array[0]).

> thanks

Your welcome.

> --
> Et nunc, auxilium solis, vincam!
> Oppugnatio solaris!
> VIS!
>
> Massimiliano Cialdi
> cialdi@gmail.com
> massimiliano.cialdi@powersoft.it

Best regards,
Eus


      


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]