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

Низкоуровневые тонкости программирования на С++ - C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
KernelSource
0 / 0 / 0
Регистрация: 09.02.2012
Сообщений: 19
22.10.2012, 22:04     Низкоуровневые тонкости программирования на С++ #1
Здравствуйте. Хотел бы узнать у опытных программистов, где можно найти литературу по более продвинутым вопросам программирования с С++, т.е. таких как, выделение памяти при создании экземпляров класса, доступ к методам класса, скрытое (от разработчика) создание временных переменных в процессе выполнения, хранение в памяти динамических массивов и осуществление доступа к их ячейкам (если массив хранится в виде нескольких кусков, например) и т.п. То есть по более "низкоуровневым вопросам", связанным с работой компиляторов, менеджеров памяти и др., которые не освещены в большинстве книг по С++.

ПС. Я просто не знаю как лучше (обобщенно) назвать такого рода вопросы, чем "низкоуровневые вопросы"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2012, 22:04     Низкоуровневые тонкости программирования на С++
Посмотрите здесь:

C++ Тонкости быстрой сортировки
C++ Тонкости работы ползунков
C++ Начало программирования
C++ Прошу пояснить тонкости данного кода
Тонкости кода: wchar_t* FilterFiles = L"cool"; C++
Как называется движение программирования или теория программы считывающая др. язык программирования C++
Низкоуровневые функции работы с файлами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
22.10.2012, 22:27     Низкоуровневые тонкости программирования на С++ #2
Конкретно такой литературы не встречал.
Подобные вопросы часто встречаются в разных книгах безсистемно. Например, много таких тонкостей описано в книгах "Сложные задачи на С++" и "Новые сложные задачи на С++" Саттера. У Александреску в книге про проектирование на С++ есть раздел про выделение памяти для маленьких объектов. Ну и много где ещё по мелочи.
Мне думается, специальной такой литературы не найти. Низкоуровневые тонкости на то и низкоуровневые, чтобы зависеть от компиляторов и платформ, а потому сложно систематизируемые.
KernelSource
0 / 0 / 0
Регистрация: 09.02.2012
Сообщений: 19
22.10.2012, 22:43  [ТС]     Низкоуровневые тонкости программирования на С++ #3
Цитата Сообщение от John Prick Посмотреть сообщение
зависеть от компиляторов и платформ
Даже это было бы неплохо, скажем на русском языке.
Но даже на английском, на странице документации эмборкадеро С++ не могу найти то, что нужно в моем случае. Невозможно, чтобы такие тонкости у них не документировались! Или я неправильно ищу?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12286 / 6973 / 784
Регистрация: 27.09.2012
Сообщений: 17,286
Записей в блоге: 2
Завершенные тесты: 1
22.10.2012, 23:17     Низкоуровневые тонкости программирования на С++ #4
Цитата Сообщение от KernelSource Посмотреть сообщение
выделение памяти при создании экземпляров класса, доступ к методам класса, хранение в памяти динамических массивов и осуществление доступа к их ячейкам
Ну это, как мне кажется, есть почти в любой книге.
Цитата Сообщение от KernelSource Посмотреть сообщение
где можно найти литературу по более продвинутым вопросам программирования с С++
Почитайте, может понравится:
Стив Макконнелл - Совершенный код. Мастер-класс
KernelSource
0 / 0 / 0
Регистрация: 09.02.2012
Сообщений: 19
23.10.2012, 12:55  [ТС]     Низкоуровневые тонкости программирования на С++ #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Сообщение от KernelSource
выделение памяти при создании экземпляров класса, доступ к методам класса, хранение в памяти динамических массивов и осуществление доступа к их ячейкам
Ну это, как мне кажется, есть почти в любой книге.
Нет, вы неправильно поняли, я говорю не про MyClass->Field и Array[Index]
Я про низкоуровневую реализацию и механизмы. И речь идет не про эти КОНКРЕТНЫЕ вопросы, я привел их в пример, чтобы объяснить, что я имею в виду когда говорю "низкоуровневая реализация и механизмы".

Цитата Сообщение от Croessmah Посмотреть сообщение
Почитайте, может понравится:
Стив Макконнелл - Совершенный код. Мастер-класс
Я читал парочку глав оттуда. Это книга советов программисту, типа "Не возжелай исходников ближнего своего", "Повысь духовный уровень своего кода" итд. К моему вопросу не имеет отношения, одним словом.
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,888
23.10.2012, 17:08     Низкоуровневые тонкости программирования на С++ #6
Если я правильно понимаю ваш вопрос, вам нужна литература по ассемблеру и устройству(и принципам работы) операционных систем.
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.10.2012, 17:12     Низкоуровневые тонкости программирования на С++ #7
KernelSource, как плюсовые код представлен на низком уровне, хорошо написано в книге К. Касперски "искусство дизассемблирования". Он дает примеры кода, а потом описывает, что получается после компиляции.
OhMyGodSoLong
23.10.2012, 17:20
  #8

Не по теме:

Цитата Сообщение от KernelSource Посмотреть сообщение
Я про низкоуровневую реализацию и механизмы. И речь идет не про эти КОНКРЕТНЫЕ вопросы, я привел их в пример, чтобы объяснить, что я имею в виду когда говорю "низкоуровневая реализация и механизмы"
Я б тоже хотел книгу «Аннотированные исходные коды компилятора gcc 4.7.2 (в сорока трёх томах)»...

Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
23.10.2012, 17:47     Низкоуровневые тонкости программирования на С++ #9
Изучаешь ассемблер, потом компилируешь сишный код и смотришь, что реально получается. Даже если ты найдешь книгу, с ответами на твои вопросы, то без знания ассемблера все равно глубокого понимания не будет. Например ты будешь знать, что где-то там есть какой-то там стек, и что память под переменные выделяется простым изменением указателя на верхушку стеку. Но толку от таких знаний не много.

Добавлено через 1 минуту
Цитата Сообщение от rangerx Посмотреть сообщение
Если я правильно понимаю ваш вопрос, вам нужна литература по ассемблеру и устройству(и принципам работы) операционных систем.
Я бы еще сюда добавил режимы работы процессора.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.10.2012, 17:48     Низкоуровневые тонкости программирования на С++ #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Стив Макконнелл - Совершенный код. Мастер-класс
Тоже рекомендую. Только это вообще не про С++.

Цитата Сообщение от KernelSource Посмотреть сообщение
выделение памяти при создании экземпляров класса
Любая книга выше уровня "чайника". Рекомендую Александреску почитать. Там хоть и про шаблоны, но выделение памяти для экземпляров рассмотрено четырьмя способами, кажется.


Цитата Сообщение от KernelSource Посмотреть сообщение
доступ к методам класса
Опять же Александреску + Рихтер. Но в основном это только для виртуальных методов смысл есть, иначе можно обойтись указателями на методы.


Цитата Сообщение от KernelSource Посмотреть сообщение
скрытое (от разработчика) создание временных переменных в процессе выполнения
Почти любая книжка. Учитывая, что оптимизирующий компилятор может обходиться без временных объектов даже тогда, когда ты их сам создаёшь, то можно просто забить и забыть. Достаточно реализовать ккорректные конструктор копирования и оператор присваивания.


Цитата Сообщение от KernelSource Посмотреть сообщение
хранение в памяти динамических массивов
Любая книжка для чайников. Ответ содержится в вопросе: массив - непрерывный участок памяти.


Цитата Сообщение от KernelSource Посмотреть сообщение
существление доступа к их ячейкам (если массив хранится в виде нескольких кусков, например)
А это уже не массив, т.к. невозможно обеспечить доступ за время О(1). А реализовать контейнер с индексированным доступом, без константного времени доступа к элементам задача тривиальная.


Цитата Сообщение от KernelSource Посмотреть сообщение
связанным с работой компиляторов, менеджеров памяти и др., которые не освещены в большинстве книг по С++
Они не освещены, потому что их реализация не стандартизована и каждый разработчик компилятора делает их по своему усмотрению. То же касается ОС. Для основных сведений читай Рихтера.
KernelSource
0 / 0 / 0
Регистрация: 09.02.2012
Сообщений: 19
23.10.2012, 19:04  [ТС]     Низкоуровневые тонкости программирования на С++ #11
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ответ содержится в вопросе: массив - непрерывный участок памяти.
Не смог промолчать. Нет Deviaphan, ДИНАМИЧЕСКИЙ массив это не непрерывный(физически) участок памяти.

Цитата Сообщение от Deviaphan Посмотреть сообщение
Они не освещены, потому что их реализация не стандартизована и каждый разработчик компилятора делает их по своему усмотрению.
А в документации к конкретному компилятору их тоже нет? Скажем к билдеру или MS C++?

Цитата Сообщение от Kastaneda Посмотреть сообщение
Например ты будешь знать, что где-то там есть какой-то там стек, и что память под переменные выделяется простым изменением указателя на верхушку стеку.
Ну слава богу, про сущ-е стека вызовов я в курсе, но знаю асм не на таком уровне чтобы
Цитата Сообщение от Kastaneda Посмотреть сообщение
потом компилируешь сишный код и смотришь, что реально получается
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.10.2012, 19:05     Низкоуровневые тонкости программирования на С++ #12
KernelSource, странный ты. Как ты хочешь разбираться в коде, если не хочешь смотреть ассемблерный листинг того, что сделал компилятор?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
23.10.2012, 19:18     Низкоуровневые тонкости программирования на С++ #13
Цитата Сообщение от KernelSource Посмотреть сообщение
ДИНАМИЧЕСКИЙ массив это не непрерывный(физически) участок памяти.
А что?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1238 / 987 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.10.2012, 19:28     Низкоуровневые тонкости программирования на С++ #14
Цитата Сообщение от Kastaneda Посмотреть сообщение
Цитата Сообщение от KernelSource Посмотреть сообщение
Не смог промолчать. Нет Deviaphan, ДИНАМИЧЕСКИЙ массив это не непрерывный(физически) участок памяти.
А что?
Нет, ну полуправдой этот ответ можно считать. Если под "физически" понимать действительно физически. На планке памяти, а не с точки зрения виртуальной памяти. Но тогда, вообще-то говоря, любые массивы не обязательно непрерывны.

Цитата Сообщение от KernelSource Посмотреть сообщение
А в документации к конкретному компилятору их тоже нет? Скажем к билдеру или MS C++?
Документация, которая покрывает такие аспекты работы, не нужна 99,999% пользователей. Она нужна разработчикам и мейнтейнерам компилятора, так что и искать её надо в исходниках и во внутренней документации. Не думаю, что MS и кто там сейчас владеет Билдером будут её выставлять в публичный доступ.

Уровень вхождения, естественно, там невероятно высокий.
Kastaneda
23.10.2012, 19:45
  #15

Не по теме:

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Если под "физически" понимать действительно физически. На планке памяти, а не с точки зрения виртуальной памяти. Но тогда, вообще-то говоря, любые массивы не обязательно непрерывны.
Если процессор не работает в real mode.

KernelSource
0 / 0 / 0
Регистрация: 09.02.2012
Сообщений: 19
23.10.2012, 19:50  [ТС]     Низкоуровневые тонкости программирования на С++ #16
Цитата Сообщение от Vourhey Посмотреть сообщение
KernelSource, странный ты. Как ты хочешь разбираться в коде, если не хочешь смотреть ассемблерный листинг того, что сделал компилятор?
Я бы рад, но ассемблер хромает. Да и что то подсказывает, что в данном случае это не самый рациональный путь.



Цитата Сообщение от Kastaneda Посмотреть сообщение
А что?
Динамический массив, в отличие от статического, не обязан быть непрерывным блоком данных, он может состоять из нескольких блоков различной длины, лежащих в разных уголках памяти. По нему не пробежишься, инкрементируя указатель. двумерный ДМ вообще является одномерным массивом указателей на одномерные динамические массивы. т.е Arr[3][4] не лежит рядом с Arr[3][5], рядом лежат только указатели на "подмассивы" и то не факт что лежат
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.10.2012, 19:53     Низкоуровневые тонкости программирования на С++ #17
Цитата Сообщение от KernelSource Посмотреть сообщение
ДИНАМИЧЕСКИЙ массив это не непрерывный(физически) участок памяти.
ЛОЛ ШТО? Это динамически выделенный НЕПРЕРЫВНЫЙ участок памяти. Слово массив не может интерпретироваться никак иначе по определению.
KernelSource
0 / 0 / 0
Регистрация: 09.02.2012
Сообщений: 19
23.10.2012, 20:03  [ТС]     Низкоуровневые тонкости программирования на С++ #18
Цитата Сообщение от Deviaphan Посмотреть сообщение
ЛОЛ ШТО? Это динамически выделенный НЕПРЕРЫВНЫЙ участок памяти. Слово массив не может интерпретироваться никак иначе по определению.
перевод Addressing pointers. Автор: Rudy Velthuis:
http://www.transl-gunsmoker.ru/2009/...tml#references

Да и в конце концов, невозможно гарантированно динамически выделить непрерывный участок памяти, чтобы его можно было бы увеличивать несколько раза сто и он оставался бы непрерывным.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.10.2012, 20:13     Низкоуровневые тонкости программирования на С++ #19
Цитата Сообщение от KernelSource Посмотреть сообщение
чтобы его можно было бы увеличивать несколько раза сто и он оставался бы непрерывным
Массив обязан быть непрерывным. Я так понимаю, ты имел в виду массив динамически изменяемого размера, а не просто массив в динамической памяти. Но это ничего не меняет. Можешь посмотреть реализацию std::vector, это и есть массив изменяемого размера. Ты можешь сделать контейнер с индексированным доступом, который будет состоять из нескольких участков памяти, но это уже не будет массив.

Добавлено через 2 минуты
Цитата Сообщение от KernelSource Посмотреть сообщение
перевод
"Динамический массив - это блок выделенной памяти" А блок выделенной памяти всегда непрерывен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2012, 20:22     Низкоуровневые тонкости программирования на С++
Еще ссылки по теме:

C++ Тонкости типов данных
C++ Нюансы синтаксиса и тонкости использования указателей и массивов
Объясните некоторые тонкости указателей C++
Тонкости терминологии: что такое оператор, операция, инструкция и кто из них operator, а кто statement? C++
C++ Какие книги стоит прочитать начинающему программисту С++ , чтобы понять все тонкости программирования?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.10.2012, 20:22     Низкоуровневые тонкости программирования на С++ #20
Цитата Сообщение от KernelSource Посмотреть сообщение
Динамический массив, в отличие от статического, не обязан быть непрерывным блоком данных, он может состоять из нескольких блоков различной длины, лежащих в разных уголках памяти. По нему не пробежишься, инкрементируя указатель.
Где так написано?
Yandex
Объявления
23.10.2012, 20:22     Низкоуровневые тонкости программирования на С++
Ответ Создать тему
Опции темы

Текущее время: 20:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru