как отменить выравнивание переменных по ширине процессорного слова

nagisa
Дата: 04.02.2015 09:33:22
Дано - СИ + Linux 64bit, большие массивы в оперативке

как отменить выравнивание переменных по ширине процессорного слова ?
те объявляешь uint8_t, а физически один фиг - 8 байт выделяется

хочу протестировать на сколько упадет скорость при работе без выравнивания
те оценить что выгоднее - наращивать оперативку или на сколько-то потерять в производительности
Dima T
Дата: 04.02.2015 09:41:02
#pragma pack
nagisa
Дата: 04.02.2015 09:52:34
Dima T,

автор
#pragma pack


это уже пробовал - не помогает
Anatoly Moskovsky
Дата: 04.02.2015 09:55:21
nagisa,

struct S {
    uint8_t v1;
    uint64_t v2;
} __attribute__((packed));


PS. Код давайте. Никто гадать не будет почему у вас там "не помогает".
Anatoly Moskovsky
Дата: 04.02.2015 10:00:00
Можно еще так
struct S {
    uint8_t v1;
    uint64_t v2  __attribute__((packed));
};
Изопропил
Дата: 04.02.2015 10:05:45
nagisa
хочу протестировать на сколько упадет скорость при работе без выравнивания

-fpack-struct ключ компилятору задайте

PS компилятор и его версию не скрывайте :)
nagisa
Дата: 04.02.2015 10:41:11
код

#pragma pack(0)

#include "ocilib.h"
#include <stdint.h>
#include "dynarray.h"

#define OraInt   uint32_t 
#define OraChar  uint8_t 

typedef struct 
{
	OraInt idtn;
	OraInt stop_object_up;
	OraInt stop_object_dn;
}  __attribute__((packed))  DBTypeObject;


компилируется
gcc -std=c99 -O2 итд

# gcc -v
Using built-in specs.
Target: x86_64-redhat-linux
....
Thread model: posix
gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
Barlone
Дата: 04.02.2015 10:51:09
nagisa,
и чего вы в этом примере ожидаете от изменения выравнивания?
nagisa
Дата: 04.02.2015 11:01:22
Barlone,

cмотрите внимательно - платформа 64х битная
те выделяется всегда 8 байт на любую переменную вне зависимости - uint8_t , uint32_t или uint64_t

2Изопропил
-fpack-struc
тоже никакого изменения
Изопропил
Дата: 04.02.2015 11:20:12
nagisa,

переменных так много что ли?

ну сгруппируйте в упакованную структуру для экспериментов