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

Выделение памяти под структуры - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сортировка вектора массива после удалание элемента http://www.cyberforum.ru/cpp-beginners/thread640869.html
дан массив векторов из 20 чисел; vectorArr = {0,1,2,3,4,5...}; удаляем методом vectorArr.erase(vectorArr.begin()+index); вопрос : как отсортировать массив по убыванию после удаления? типа ( выбрали число vectorArr , тогда vectorArr принимает значение vectorArr т.е равная трём. и так далее до 20.
C++ Приведение void указателя к определенному типу с сохранением результата Есть функция funс(void *pointer, char type) { ... } Нужно чтобы в данной функции этот указатель приводился к определенному типу в зависимости от type, так, чтобы дальше можно было с ним работать без постоянного приведения типа через скобки. Пробовал создавать другой указатель нужного типа: if(type) typeone *pointer2 = (typeone *)pointer; else typetwo *pointer2 = (typetwo... http://www.cyberforum.ru/cpp-beginners/thread640866.html
Преобразование в указатель на указатель на константу C++
В упор не могу понять правила которые приводит Дьюхерст для преобразований "многоуровневых" указателей. (Дьюхерст "Скользкие места С++" Совет 32 "Преобразование в указатель на указатель на константу" стр 79) Пример: int ***const cnnn= 0;
Чтение из файла: getline() не работает C++
У меня такая ситуация: Есть два файла: words1.txt и cities-source.txt. Прилагаются. Берем первую строку из words1 и начинаем сравнивать со строками в cities-source. Если во втором файле есть такая строка, то её печатаем. Но я до этого не дошел, после того как i инкрементируется до 2, поиск в cities-source.txt не начинается с начала. В чём моя ошибка? |asd_min=48 |word1= |word1=123...
C++ Переполнение буфера! (наверное) http://www.cyberforum.ru/cpp-beginners/thread640824.html
Идет открытие порта звуковой карты, получение битов, запись битов в буфер и дальнейшие манипуляции с ним (пока только вывод в текстовый файл). Запускаю программу все отлично, ошибки с буфером нет, но выполнение записи видимо не проходит (т.е. я думаю переполняеться буфер), доходит до копирования битов и все (этот процесс занимает не понятно сколько времени). Что не так выполнение программы...
C++ Цикл действий У меня при нажатии на кнопку происходит определенное действие. Но если нажать и удерживать кнопку то это действию будет происходить бесконечно. Как этого избежать??? подробнее

Показать сообщение отдельно
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84

Выделение памяти под структуры - C++

22.08.2012, 08:49. Просмотров 2085. Ответов 6
Метки (Все метки)

Когда я только знакомился с кодингом на С(С++) я скачивал с инета очень много всякой литературы... Так вот... Недавно я начал заново перечитывать эти книжки(статьи), хотел проверить насколько я продвинулся. (лол че...) Наткнулся на такую вот инфу:

Когда sizeof применяются к имени типа структуры или объединения или к идентификатору имеющему тип структуры или объединения, то результатом является фактический размер структуры или объединения, который может включать участки памяти, используемые для выравнивания элементов структуры или объединения. Таким образом, этот результат может не соответствовать размеру, получаемому путем сложения размеров элементов структуры.
Ну автор привел пример:
C
1
2
3
4
5
6
 struct     { char   h;
                   int    b;
                   double f;
                 } str;
      int a1;
      a1  = sizeof(str);
После чего автор говорит:
Переменная а1 получит значение, равное 12, в то же время если сложить длины всех используемых в структуре типов, то получим, что длина структуры str равна 7.

Несоответствие имеет место в виду того, что после размещения в памяти первой переменной h длинной 1 байт, добавляется 1 байт для выравнивания адреса переменной b на границу слова (слово имеет длину 2 байта для машин серии IBM PC AT /286/287), далее осуществляется выравнивание адреса переменной f на границу двойного слова (4 байта), таким образом в результате операций выравнивания для размещения структуры в оперативной памяти требуется на 5 байт больше.

В связи с этим целесообразно рекомендовать при объявлении структур и объединения располагать их элементы в порядке убывания длины типов.
Ну я как тру-кодер решил проверить на своей машине
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
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
 
struct { 
    char   h;
    int    b;
    double f;
       } str;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a1;
 
    printf("size DWORD: %d \n", sizeof(DWORD)); //Следовательно, размер слова - 2 байта (быдло. че еще сказать... по другому не судьба определить)
    printf("size char: %d \n",sizeof(char));
    printf("size int: %d \n",sizeof(int));
    printf("size double: %d \n",sizeof(double));
    printf("size struct: %d \n",sizeof(str));
 
    system("pause");
    return 0;
}
Получил вот такое вот:
Выделение памяти под структуры

Компилятор, как вы поняли - Майкрософтовский (Вижуал студио)... Поясните что это за байда с выраниванием.... И например у меня тип double 8 байт, размер слова - 2 байта... 8/2 = 4 (ровно 4 слова, мы же как раз поместились... ) или тип int 4 байта, тоже влезли в 2 слова... Получается никакого выравнивания не должно быть. Только тип char - 1 байт(его выравнили до 2 байт)...
Итогодебит, кредит епт...)
2+4+8 = 14(а она 16 байт)
Что я упустил?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru