Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.07;
Скачать: CL | DM;

Вниз

C++ дефайны и выравнивание.   Найти похожие ветки 

 
Riply ©   (2008-07-20 07:53) [0]

Здравствуйте !
Допустим, есть у нас такой "дефайн":
#define RTL_CONSTANT_STRING(s) { sizeof(s)-sizeof((s)[0]), sizeof(s), s }
и мы, с его помощью декларируем константу:
const UNICODE_STRING TestFile = RTL_CONSTANT_STRING(L"\\??\\E:\\Delete Files\\TestFile.txt");

Дело происходит под C++Builder 2006.
Все работает и не вякает :)
Теперь меняем настройки CodeGuard
После включения опции "All CodeGuard options on", я столкнулась с тем,
что при данной инициализации TestFile`а, его Buffer может получиться
не выровненным даже на 16-битную границу. (Зависит от фазы луны, но проявляется довольно часто :)
Разумеется, после этого Nt - функции, его принимающие начинают ругаться,
причем не цензурно :)

Например, имеем такой код:
UNICODE_STRING TestFile;// = RTL_CONSTANT_STRING(L"\\??\\E:\\Delete Files\\TestFile.txt");
RtlInitUnicodeString(&TestFile, L"\\??\\E:\\Delete Files\\TestLogFile.txt");
Он работает, при любых настройках CodeGuard`а.
Но стоит раскоментировать кусокчек первой строки (оставлять или убирать вторую - роли не играет),
как данный код, становится роботоспособным, только при выключенном CodeGuard.

У меня есть много UNICODE_STRING констант, которые надо инициализировать.
Как это сделать так, чтобы их Buffer при этом был "выровнен" на 32-битную границу
и это не зависило от всяких внешних настроек типа CodeGuard`а ?


 
ketmar ©   (2008-07-20 14:19) [1]

не использовать быдлер?

---
All Your Base Are Belong to Us


 
Simpson ©   (2008-07-20 14:31) [2]

Ось какая?


 
Riply ©   (2008-07-20 14:46) [3]

> [1] ketmar ©   (20.07.08 14:19)
> не использовать быдлер?

А кто такой "быдлер" ?

> [2] Simpson ©   (20.07.08 14:31)
> Ось какая?

XP SP2 (а может и SP3 - поставила на автоматическое обновление. Не знаю установился или нет)


 
@!!ex ©   (2008-07-20 15:43) [4]

> А кто такой "быдлер" ?

Builder... Чесс слово KDevelop или MSVC++ - лучше.


 
Anatoly Podgoretsky ©   (2008-07-20 15:57) [5]

> Riply  (20.07.2008 14:46:03)  [3]

> XP SP2 (а может и SP3

Правая кнопка на "Мой компьютер" и свойства.


 
Riply ©   (2008-07-20 17:07) [6]

> [4] @!!ex ©   (20.07.08 15:43)
>Builder... Чесс слово KDevelop или MSVC++ - лучше.

Чем лучше ?
Я еще не определилась со средой. Компилю под Builder и VS 2005 поочереди :)

>  [5] Anatoly Podgoretsky ©   (20.07.08 15:57)
> Правая кнопка на "Мой компьютер" и свойства.

Спасибо :)
Значит я не обновилась - сижу под SP2 :)


 
Anatoly Podgoretsky ©   (2008-07-20 17:18) [7]

> Riply  (20.07.2008 17:07:06)  [6]

Скачай вручную, до 300 мб на язык и запусти установку, несколько часов.


 
Riply ©   (2008-07-20 17:23) [8]

>  [7] Anatoly Podgoretsky ©   (20.07.08 17:18)
> Скачай вручную, до 300 мб на язык и запусти установку, несколько часов.

Анатолий, я под Dial-up`ом сижу. И, пока еще, нет возможности изменить это :(


 
Simpson ©   (2008-07-20 18:06) [9]

А что ты вообще хотела сделать?


 
Riply ©   (2008-07-20 18:09) [10]

> [9] Simpson ©   (20.07.08 18:06)
> А что ты вообще хотела сделать?

Мне надо объявить UNICODE_STRING`ские константы.


 
Simpson ©   (2008-07-20 18:10) [11]

Через #define никак?


 
Simpson ©   (2008-07-20 18:13) [12]

ИМХО слишком все запутанно, выравнивание по 32 зачем?


 
Riply ©   (2008-07-20 18:16) [13]

> [11] Simpson ©   (20.07.08 18:10)
> Через #define никак?

RTL_CONSTANT_STRING

> [12] Simpson ©   (20.07.08 18:13)
> ИМХО слишком все запутанно, выравнивание по 32 зачем?

Для спокойной работы с Nt-функциями.


 
Simpson ©   (2008-07-20 18:27) [14]

Code::Block попробывал что то подобное изобразить мосск вскипел))

Если все тоже сделать inline функцией и отладить нормально у же как функцию.
Скорость от этого постардать не должна.


 
Riply ©   (2008-07-20 19:34) [15]

> [14] Simpson ©   (20.07.08 18:27)
> Если все тоже сделать inline функцией и отладить нормально у же как функцию.
> Скорость от этого постардать не должна.

Да можно, конечно...
Но я терпеть не могу удирать от проблем
и оставлять за спиной нерешенные (непонятые) вещи.

Уж не говоря о том, что что-то подобное может произойти в другом месте и в другое время.


 
Simpson ©   (2008-07-20 19:41) [16]

Riply ©   (20.07.08 19:34) [15]
ИМХО где то в функции не стыковка, на define точку останова не поставиш, отладить функцию и уже отлаженную закинуть в define. Только следующий программист повеситься сопровождая))


 
guav ©   (2008-07-20 20:00) [17]

Я так понял, цель - инициализировать UNICODE_STRING именно статически, и именно заставив препроцесор сгенерить весь код ?
Предлагаю что-то вроде (__declspec(align(1024)) заменить на то что в билдере):

#define DECLARE_RTL_CONSTANT_STRING(d, s) \
 __declspec(align(1024)) const WCHAR d##_value[sizeof(s)/sizeof(WCHAR)] = { s }; \
 const UNICODE_STRING d = \
   {sizeof(s)-sizeof((s)[0]), sizeof(s), const_cast<WCHAR*>(d##_value) };


 
guav ©   (2008-07-20 20:01) [18]

DECLARE_RTL_CONSTANT_STRING(TestFile, L"\\??\\E:\\Delete Files\\TestFile.txt")
...
 wprintf(L"%p == %.*s", TestFile.Buffer, TestFile.Length, TestFile.Buffer);


 
Riply ©   (2008-07-20 20:36) [19]

> [17] guav ©   (20.07.08 20:00)
Привет :)

> Я так понял, цель - инициализировать UNICODE_STRING именно статически,
> и именно заставив препроцесор сгенерить весь код ?

Угу - по отношению к первой половине фразы, ибо вторая еще пока сложна для моего восприятия :)

> Предлагаю что-то вроде (__declspec(align(1024)) заменить на то что в билдере):

Спасибо. Побежала искать "то что в билдере".

P.S.
Под VS, как я поняла этот код работет ? (Я там (под VS) тоже сижу :)


 
имя   (2008-07-20 20:39) [20]

Удалено модератором


 
guav ©   (2008-07-20 21:01) [21]

> [19] Riply ©   (20.07.08 20:36)


> Угу - по отношению к первой половине фразы, ибо вторая еще
> пока сложна для моего восприятия :)

Первая половина:
size_t F() { return(42); };
const size_t i = 42; // статическая инициализация
const size_t j = F(); // динамическая инициализация
// или менее очевидный, но более жизненный пример:
const size_t k = _countof("Привет :)") - 1; // статическая инициализация
const size_t l = strlen("Привет :)"); // динамическая инициализация
// или с классами:
struct X { int i; } x = {}; // статическая инициализация
struct Y {
 Y() : i(0) {};
 int i;
} y;
// динамическая инициализация
Вторая половина:
Нигде явно не писать длину, лишних обявлений, и т.п., нагрузив этим часть компилятора обрабатывающего дефайны.


> Под VS, как я поняла этот код работет ?

Да.
Можно ещё убрать скобки = { s }; - остались от варианта с шаблонами.


 
AlexDan ©   (2008-07-20 21:27) [22]

> имя   (20.07.08 20:39) [20]
Хорошо хоть фамилию оставили).


 
guav ©   (2008-07-20 21:32) [23]

Динамическая инициализация, зато без единого дефайна:
struct unicode_string_t : UNICODE_STRING
{
 unicode_string_t(const WCHAR* s, WORD len)
 {
   Length = len - 1;
   MaximumLength = len;
   if (Buffer = reinterpret_cast<WCHAR*>(_aligned_malloc(len, 1024)))
   {
     memcpy(Buffer, s, len * sizeof(WCHAR));
   }
 }
 ~unicode_string_t(void)
 {
   _aligned_free(Buffer);
 }
};

template<size_t len>
UNICODE_STRING InitStr(const WCHAR (&s)[len])
{
 static unicode_string_t v(s, len);
 return v;
}

const UNICODE_STRING TestFile = InitStr(L"\\??\\E:\\Delete Files\\TestFile.txt");

int _tmain(int argc, _TCHAR* argv[])
{
 wprintf(L"%p == %.*s", TestFile.Buffer, TestFile.Length, TestFile.Buffer);
 return 0;
}


 
guav ©   (2008-07-20 21:38) [24]

Точнее, [23] конечно, работать не будет для нескольки строк одинаковой длины, но идея думаю понятна...


 
Riply ©   (2008-07-20 21:43) [25]

> [21] guav ©   (20.07.08 21:01)
> [23] guav ©   (20.07.08 21:32)

Спасибо !

P.S.
Уфф. Ты думаешь, я в состоянии переваривать все это с такой скоростью ?
Да я еще до сих пор вместо "==" настырно пытаюсь писать "=" :)


 
guav ©   (2008-07-20 22:04) [26]

> Да я еще до сих пор вместо "==" настырно пытаюсь писать  "=" :)

Я тоже иногда :) пиши rvalue слева - не ошибёшься.
по [23] - что происходит внутри InitStr можешь не смотреть, оно всё равно не правильно, главное, что я хотел показать - InitStr возвращает UNICODE_STRING, которая инициализирует константу, и что есть static переменная с деструктором для последующего освобождения строки.


 
Riply ©   (2008-07-20 22:39) [27]

> [26] guav ©   (20.07.08 22:04)

Здорово !
Твоему DECLARE_RTL_CONSTANT_STRING глубоко плевать на всякие там CodeGuard`ы вместе с их "options",
знай выравнивает себе и в ус не дует :)



Страницы: 1 вся ветка

Текущий архив: 2008.09.07;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.016 c
3-1205310393
KPV-10k
2008-03-12 11:26
2008.09.07
Как узнать что запись захвачена другим пользователем (Firebird)


2-1216792046
TStas
2008-07-23 09:47
2008.09.07
Есть ли какой-то особенный класс исключений при записи в ReadOnly


2-1217429651
lavgirls
2008-07-30 18:54
2008.09.07
Состояние подключения


15-1216122640
denic
2008-07-15 15:50
2008.09.07
AVR + LCD


2-1217423928
ZLO
2008-07-30 17:18
2008.09.07
Файловые потоки NTFS