Форум программистов, компьютерный форум CyberForum.ru

sizeof на битовую структуру - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычислить значение выражения http://www.cyberforum.ru/cpp-beginners/thread675513.html
Помогите прописать решение на программе Borland: z = \frac{\log_{2 - x^2}\, (1 + y^2)}{\log_{2 + |y|} \,(1 + |x|)}
C++ Сортировка массива Задается размер массива N и затем с клавиатуры вводится вещественный массив заданного размера. Отсортировать по возрастанию элементы массива, находящиеся между первым и последним нулевыми элементами. В задаче должно быть использованы следующие действия: ввод количества элементов и элементов массива с клавиатуры, построчный ввод элементов массива на экран, функции обработки массива в соответствии... http://www.cyberforum.ru/cpp-beginners/thread675486.html
Массив, вычисление суммы C++
Добрый день, помогите, пожалуйста найти ошибку в решении или подскажите свой вариант. Задание: В одномерном вещественном динамическом массиве из n чисел вычислить: сумму всех положительных элементов массива, расположенных между первым и последним максимальными элементами, сумму элементов массива, расположенных до предпоследнего минимального элемента. Сформировать новый массив, состоящий из...
Для чего нужна main и в чём принцип обхода массива в цикле C++
Доброе время суток, хотелось бы услышать ответы на несколько легких вопросов. Зачем писать int main()\void main(), и что за этим стоит; зачем при написании матрицы(двумерного массива) мы пишем такую вещь для индексов for(i=0;i<n;i++). Спасибо.
C++ Как происходит циклический сдвиг (как сдвинуть элементы в массиве) http://www.cyberforum.ru/cpp-beginners/thread675468.html
Задан массивы действительных чисел а1, а2,…,а20. Сдвинуть циклическим сдвигом все его элементы так, чтобы минимальный элемент стоял на последнем месте. понимаю что элементы влево или право двигаются при сдвиге.читала что вот такими >> и << .а как сдвиг сделать - не знаю..особенно как min на последнее место переместить.. подскажите хоть немножечко. сделала только вот #include "stdafx.h"...
C++ Определить, сколько раз в массиве встретилось два подряд идущих нулевых элемента Пример: Сформировать массив целых чисел X(N), элементами которого являются случайные числа в диапазоне . Найти максимальный элемент и его номер. #include <stdio.h> #include <stdlib.h> #include <conio.h> void main() { const int N=100; int a,n; do подробнее

Показать сообщение отдельно
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
21.10.2012, 12:09     sizeof на битовую структуру
Почти ни разу не пользовался битовыми полями, поэтому захотелось сравнить в "полевых" условиях.
Пример специально "запутан", чтобы компилятор не сумел оптимизировать то, чего сравнить хотелось.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "stdafx.h"
#include <iostream>
using namespace std;
 
typedef unsigned int Field;
 
struct Color16bitS
{ 
    Field r : 5;
    Field g : 5;
};
 
class Color16bit
{
public:
    void SetR(Field r)
    {
        rgbk &= 0xE0;
        rgbk |= r;
    }
 
    Field GetR() const
    {   return rgbk & 0x1F; }
 
    void SetG(Field g)
    {
        rgbk &= 0xF5EF;
        rgbk |= (g<<5);
    }
 
    Field GetG() const
    {   return (rgbk >> 5) & 0x1F;  }
 
 
    Field rgbk;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    Field r, g;
    cin >> r >> g;
 
    {
        Color16bitS f;
                
        f.r = r;
        f.g = g;
 
        Field sum = 0;
        if( f.r > 3 )
            sum = f.r + f.g;
        else
        {
            f.r = 0;
        }
 
        cout << sum << " " <<  sizeof(f) << endl;
    }
    
    {
        Color16bit f;
 
        f.SetR(r);
        f.SetG(g);
 
        Field sum = 0;
        if( f.GetR() > 3 )
            sum = f.GetR() + f.GetG();
        else
            f.SetR(0);
 
        cout << sum << " " << sizeof(f) << endl;
    }
 
    cin.get();
    return 0;
}
Оно же (компилятор msvc2010 с оптимизацией по скорости)
Оставил только интересный фрагменты
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    mov eax, DWORD PTR _g$[esp+8]
    mov edx, DWORD PTR _f$22438[esp+8]
    mov ecx, DWORD PTR _r$[esp+8]
    and eax, 31                 ; 0000001fH
    shl eax, 5
    and edx, -1024              ; fffffc00H
    and ecx, 31                 ; 0000001fH
    or  eax, edx
    or  eax, ecx
 
; 51   : 
; 52   :        Field sum = 0;
; 53   :        if( f.r > 3 )
 
    mov ecx, eax
    and ecx, 31                 ; 0000001fH
    xor edx, edx
    cmp ecx, 3
    jbe SHORT $LN4@wmain
 
; 54   :            sum = f.r + f.g;
 
    shr eax, 5
    and eax, 31                 ; 0000001fH
    lea edx, DWORD PTR [ecx+eax]
$LN4@wmain:
 
 
 
; 63   :    {
; 64   :        Color16bit f;
; 65   : 
; 66   :        f.SetR(r);
; 67   :        f.SetG(g);
 
    mov eax, DWORD PTR _f$22582[esp+8]
    mov ecx, DWORD PTR _g$[esp+8]
    and eax, 224                ; 000000e0H
    or  eax, DWORD PTR _r$[esp+8]
    shl ecx, 5
    and eax, 62959              ; 0000f5efH
    or  eax, ecx
 
; 68   : 
; 69   :        Field sum = 0;
; 70   :        if( f.GetR() > 3 )
 
    mov ecx, eax
    and ecx, 31                 ; 0000001fH
    xor edx, edx
    cmp ecx, 3
    jbe SHORT $LN2@wmain
 
; 71   :            sum = f.GetR() + f.GetG();
 
    shr eax, 5
    and eax, 31                 ; 0000001fH
    lea edx, DWORD PTR [ecx+eax]
$LN2@wmain:
Получается, что написанный вручную код всего на две операции шустрее битовых полей. Реализовывать структуру полностью мне было лень (там ещё поле для blue и один бит на colorKey должны быть). Похоже, что чем больше полей, тем больше будет выигрыш при написании вручную, но придётся писать вручную. Много. И муторно. Проще забить и использовать битовые поля.
Наименьшее число операций ри использовании типа unisgned int. При использовании int или (unsigned)short число операций возрастает для обоих методов.
В общем, забиваем на всё и используем битовые поля, но только с типом unsigned int.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru