ivan
написал 10 ноября 2004 года в 19:35 (1496 просмотров)
Ведет себя
неопределенно; открыл 4 темы в форуме, оставил 21 комментарий на сайте.
Можно ли произвести такую операцию:
а=м&р, где a,m,p — структуры:
struct STR {
char f;
char l;
}a,m,p;
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
А что бы ты хотел получить в результате такой операции? Побитовый AND полей? Или union структур?
Good Luck,
UT
Если перегрузить, то можно
(unsigned short&)a = (unsigned short&)m & (unsigned short&)p;
можно вот так попробовать, но это в корне неправильный подход :)
Простите меня уважаемые за некорректную постановку вопроса.
Я просто мучаюсь вопросами оптимизации.
На самом деле я хочу произвести логические операции над операндами размер которых больше чем позволяют стандартные типы 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
после разъяснения стало понятно ещё меньше :-\
Размер структуры не меньше суммарного размера его полей.
Что плохого в циклах то?
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& и по-моему нормально получиться..
Вообще-то нельзя, а почему не устраивет, что-то вроде:
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;
}
Очень интересный подход…
Если не трудно, поясните, мне кажется я что-то не допонимаю…
А!!! я понял зачем этот цикл, это чтобы шаг сделать побольше и тем самым увиличить скорость. Да интересное решение задачи…
именно так, кстати благодаря выравниванию структуры можно избавиться от второго цикла..
Это с помощью #pragma somthing?
это уже от компилятора зависит
А вот тут вы не правы.
смотрите здесь:
http://www.nixp.ru/cgi-bin/forum/YaBB.pl?board=coding;action=display;num=1097749116;start=15#15
из MSDN Library:
например #pragma managed используется в компиляторе mc++ , не думаю что она есть в других популярных компиляторах, а если и есть то скорее всего несёт другую смысловую нагрузку.
ok
Предоставь это компилятору. Он про оптимизацию знает больше чем ты — это его работа.
А может компилятор и за меня программы писать будет?
Я всё-таки считаю, что от алгоритма очень многое зависит.
Оптимизация есть нескольких уровней.
Есть алогримтическая, когда создаётся оптимальный алгоритм, от чего зависит бОльшая часть времени выполнения, и затем уже оптимизация на уровне отдельных шагов алгоритма.
Текущее состояние дел таково, что компиляторы оптимально генерируют код, позволяя практически не задумываться о том, как должен быть написаны отдельные операторы.
Хотя, с другой стороны, если программист знает архитектуру очень хорошо, то может сразу создавать программу так, чтобы даже на отдельных операторах выигрыш был в два-три раза. Очень редкое умение.
И никем не ценимое.
Конечно от алгаритма очень многое зависит. К примеру, что я буду сортировать массив методом пузырька, а что методом Шелла или Хоала (вроде Хоала если не ошибаюсь, я не очень хорошо помню как это имя пишется, извините). Или искать в упорядоченом массиве последовательно, когда можно делением попалам. Алгоритм намного увеличивает скорость, особенно когда прога работает с большим объемомо данных.