Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычислить значение выражения https://www.cyberforum.ru/ cpp-beginners/ thread675513.html
Помогите прописать решение на программе Borland: z = \frac{\log_{2 - x^2}\, (1 + y^2)}{\log_{2 + |y|} \,(1 + |x|)}
C++ Сортировка массива
Задается размер массива N и затем с клавиатуры вводится вещественный массив заданного размера. Отсортировать по возрастанию элементы массива, находящиеся между первым и последним нулевыми элементами. В задаче должно быть использованы следующие действия: ввод количества элементов и элементов массива с клавиатуры, построчный ввод элементов массива на экран, функции обработки массива в соответствии...
C++ Массив, вычисление суммы https://www.cyberforum.ru/ cpp-beginners/ thread675485.html
Добрый день, помогите, пожалуйста найти ошибку в решении или подскажите свой вариант. Задание: В одномерном вещественном динамическом массиве из n чисел вычислить: сумму всех положительных элементов массива, расположенных между первым и последним максимальными элементами, сумму элементов массива, расположенных до предпоследнего минимального элемента. Сформировать новый массив, состоящий из...
C++ Для чего нужна main и в чём принцип обхода массива в цикле https://www.cyberforum.ru/ cpp-beginners/ thread675469.html
Доброе время суток, хотелось бы услышать ответы на несколько легких вопросов. Зачем писать int main()\void main(), и что за этим стоит; зачем при написании матрицы(двумерного массива) мы пишем такую вещь для индексов for(i=0;i<n;i++). Спасибо.
C++ Как происходит циклический сдвиг (как сдвинуть элементы в массиве)
Задан массивы действительных чисел а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 https://www.cyberforum.ru/ cpp-beginners/ thread675458.html
C++ Дано натуральное число N и вещественное число x. Вычислить частичную сумму ряда. Дано натуральное число N и вещественное число x. Вычислить S=\sum \limits_{i = 1}^N \frac x {(N+i)!} https://www.cyberforum.ru/ cpp-beginners/ thread675450.html C++ Передать параметрами функции указатели
Нужно передать параметрами функции указатели. Вот код без указателей: #include <iostream> #include <conio.h> using namespace std; int progression (int a1, int d, int n, int k);
C++ Сортировка массива по убыванию https://www.cyberforum.ru/ cpp-beginners/ thread675407.html
Отсортировать массив P={1,2,3,4,5,6,7,8,9,0} по убыванию методом вставок. Подскажите пожалуйста как это сделать в borland 3.11?
C++ Переставить элементы массива в случайном порядке https://www.cyberforum.ru/ cpp-beginners/ thread675399.html
На вход функции подаются итераторы начала и конца массива. Нужно переставлять в цикле первый элемент с рэндомным, таким образом при одних входны данных будут получаться разные результаты. Вопрос в том, как поменять первый с рэндомным? Заранее спасибо за помощь
Кроскомпиляция или в чем засада C++
Написал не большую программку, которую можно использовать как полосу загрузки в консоли, писал на VS12(Dp) из под win7(32-bit), решил проверить на эмуляторе(wmware 9) на win xp pro(sp1, 32-bit ) , но тут возникла проблема данная системка выдала интересную фразу >>данное приложение не является win32 Вопрос: что это значит и как с ним бороться?
C++ Определить, максимальная цифра числа расположена ближе к началу или концу числа Дано натуральное число с различными цифрами. Определить, максимальная цифра числа расположена ближе к началу или концу числа. #include <stdio.h> int maxDigitRelativePosition(int aNumber) { int numberOfDigits = 0; int maxDigit = -1; int maxDigitPosition = -1; for (; aNumber > 0; aNumber /= 10, ++numberOfDigits) { int currentDigit = aNumber % 10; https://www.cyberforum.ru/ cpp-beginners/ thread675368.html
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
21.10.2012, 12:09 0

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

21.10.2012, 12:09. Показов 2118. Ответов 27
Метки (Все метки)

Ответ

Почти ни разу не пользовался битовыми полями, поэтому захотелось сравнить в "полевых" условиях.
Пример специально "запутан", чтобы компилятор не сумел оптимизировать то, чего сравнить хотелось.
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.

Вернуться к обсуждению:
sizeof на битовую структуру C++
0
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2012, 12:09
Готовые ответы и решения:

Sizeof(.) или constexpr size_t tmp = sizeof(.)
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности?...

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile)
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до...

Можно ли на 32 битовую систему установить 64 битовую sql server?
можно ли на 32 битовую систему установить 64 битовую sql server?

Как установить 32 битовую версию на 64 битовую ОС?
Проблема с установкой связи из МАТЛАБ к SQL server 2008. Win 64, МАаТЛАБ 64 и SQL server 64 бита....

27
21.10.2012, 12:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2012, 12:09
Помогаю со студенческими работами здесь

Является ли оператор sizeof синтаксическим сахаром над System.Runtime.InteropServices.Marshal.SizeOf?
Является ли оператор sizeof синтаксическим сахаром над...

Что обозначает строка вида sizeof(data)/sizeof(data[0])?
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; void bubble_sort(float *data, int size) { int i,j; ...

Marshal.SizeOf и sizeof
чем отличаются Marshal.SizeOf и sizeof? я просто почему то привык пользоваться Marshal.SizeOf, так...

Задача на битовую магию
Развлекался с модулем АЦП в одной STM-ке и наткнулся на интересную задачу. Сама задача к...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru