nixp.ru v3.0

20 октября 2017,
пятница,
19:21:50 MSK

DevOps с компанией «Флант»
ivan написал 10 ноября 2004 года в 19:35 (453 просмотра) Ведет себя неопределенно; открыл 4 темы в форуме, оставил 21 комментарий на сайте.

Можно ли произвести такую операцию:

а=м&р, где a,m,p — структуры:

struct STR {

char f;

char l;

}a,m,p;

Uncle Theodore

А что бы ты хотел получить в результате такой операции? Побитовый AND полей? Или union структур?

Good Luck,

UT

Fatal

Если перегрузить, то можно

Octane

(unsigned short&)a = (unsigned short&)m & (unsigned short&)p;

можно вот так попробовать, но это в корне неправильный подход :)

ivan

Простите меня уважаемые за некорректную постановку вопроса.

Я просто мучаюсь вопросами оптимизации.

На самом деле я хочу произвести логические операции над операндами размер которых больше чем позволяют стандартные типы C/C++, но мне не очень хочется делать это циклами, над гораздо меньшими операндами.

Поэтому у меня пал выбор на структуры, ведь размер структуры равен размеру полей в самой структуре, что правда тоже далеко не факт.

Короче говоря мне нужно получить вот такую вот фичу:

m = (STR)0xFFFF;

p = (STR)0xFFFF;

a = m&p;

—————--

тогда a должно быть равно 0xFFFF

или вот так:

m = (STR)0×0000;

p = (STR)0xFFFF;

a = m&p;

—————--

тогда a должно быть равно 0×0000

Octane

после разъяснения стало понятно ещё меньше :-\

Размер структуры не меньше суммарного размера его полей.

Что плохого в циклах то?

unsigned long *p1p, *p1m, *p1a;

unsigned char *p2p, *p2m, *p2a;

p1p = (unsigned long*)&p;

p2p = (unsigned char*)&p;

p1m = (unsigned long*)&m;

p2m = (unsigned char*)&m;

p1a = (unsigned long*)&a;

p2a = (unsigned char*)&a;

int n = sizeof(STR) / sizeof(long);

int i;

for(i = 0; i < n; i++)

*(p1a + i) = *(p1m + i) & *(p1p + i);

for(i = n*sizeof(long) ; i < sizeof(STR) ; i++)

*(p2a +i) = *(p2m + i) & *(p2p + i);

это для наглядности.. а так разбей на operator= и operator& и по-моему нормально получиться..

Fatal

Вообще-то нельзя, а почему не устраивет, что-то вроде:

struct A{

int M,P;

};

struct A AND(struct A a,struct A b){

struct A res={a.M & b.M,a.P & b.P};

return res;

}

Fatal

Очень интересный подход…

Octane
Размер структуры не меньше суммарного размера его полей.

unsigned long *p1p, *p1m, *p1a;

unsigned char *p2p, *p2m, *p2a;

p1p = (unsigned long*)&p;

p2p = (unsigned char*)&p;

p1m = (unsigned long*)&m;

p2m = (unsigned char*)&m;

p1a = (unsigned long*)&a;

p2a = (unsigned char*)&a;

размер структуры не всегда кратен sizeof(long)

int n = sizeof(STR) / sizeof(long);

int i;

Можно узнать зачем этот цикл?

for(i = 0; i < n; i++)

*(p1a + i) = *(p1m + i) & *(p1p + i);

for(i = n*sizeof(long) ; i < sizeof(STR) ; i++)

*(p2a +i) = *(p2m + i) & *(p2p + i);

Если не трудно, поясните, мне кажется я что-то не допонимаю…

Fatal

А!!! я понял зачем этот цикл, это чтобы шаг сделать побольше и тем самым увиличить скорость. Да интересное решение задачи…

Octane

именно так, кстати благодаря выравниванию структуры можно избавиться от второго цикла..

Fatal

Это с помощью #pragma somthing?

Octane

это уже от компилятора зависит

Fatal
Octane
это уже от компилятора зависит

А вот тут вы не правы.

смотрите здесь:

http://www.nixp.ru/cgi-bin/forum/YaBB.pl?board=coding;action=display;num=1097749116;start=15#15

Octane

из MSDN Library:

Each implementation of C and C++ supports some features unique to its host machine or operating system. Some programs, for instance, need to exercise precise control over the memory areas where data is placed or to control the way certain functions receive parameters. The #pragma directives offer a way for each compiler to offer machine- and operating system-specific features while retaining overall compatibility with the C and C++ languages. Pragmas are machine- or operating system-specific by definition, and are usually different for every compiler.

например #pragma managed используется в компиляторе mc++ , не думаю что она есть в других популярных компиляторах, а если и есть то скорее всего несёт другую смысловую нагрузку.

Fatal

ok

myst
ivan
Я просто мучаюсь вопросами оптимизации.

Предоставь это компилятору. Он про оптимизацию знает больше чем ты — это его работа.

ivan

А может компилятор и за меня программы писать будет?

Я всё-таки считаю, что от алгоритма очень многое зависит.

Genie

Оптимизация есть нескольких уровней.

Есть алогримтическая, когда создаётся оптимальный алгоритм, от чего зависит бОльшая часть времени выполнения, и затем уже оптимизация на уровне отдельных шагов алгоритма.

Текущее состояние дел таково, что компиляторы оптимально генерируют код, позволяя практически не задумываться о том, как должен быть написаны отдельные операторы.

Хотя, с другой стороны, если программист знает архитектуру очень хорошо, то может сразу создавать программу так, чтобы даже на отдельных операторах выигрыш был в два-три раза. Очень редкое умение.

И никем не ценимое.

Fatal

Конечно от алгаритма очень многое зависит. К примеру, что я буду сортировать массив методом пузырька, а что методом Шелла или Хоала (вроде Хоала если не ошибаюсь, я не очень хорошо помню как это имя пишется, извините). Или искать в упорядоченом массиве последовательно, когда можно делением попалам. Алгоритм намного увеличивает скорость, особенно когда прога работает с большим объемомо данных.