A.M.A.

Oct. 2nd, 2009 04:04 pm
plakhov: (Default)
Если кто-нибудь о чем-нибудь хотел меня спросить, или что-нибудь сказать, или о чем-нибудь поговорить, но повода не было, можете сделать это сейчас. А то я подумываю, не бросить ли ЖЖ нафиг в пользу RL. Да и вообще, жизнь коротка.

Изначально комментарии скрываются, но только на всякий случай (ну мало ли о чем вы там спрашивать собираетесь).

Ask me anything.
plakhov: (Default)
По следам поста [profile] _winnie  предлагается следующий вариант синтаксиса гарантированной инициализации.

Кстати, я в последний раз писал new, не ставя сразу за ним открывающую круглую скобку, больше полугода назад. В текущем проекте это является грубой ошибкой (времени исполнения, а не времени компиляции; что, кстати, вполне можно было бы поправить, если бы кто-то так ошибался).
plakhov: (Default)
Я относительно недавно начал программировать для игровых консолей, поэтому еще не все велосипеды изобретены и объезжены. Например, сегодня попал в историю при приведении голого куска памяти (где, как я думал, всегда лежит SOneData, а на деле иногда оказывается SAnotherData). Сам  факт банален, уникально то, в чем проявилась ошибка.

SOneData содержит поле "позиция", в которое именно при таком стечении обстоятельств попадает не рандомный мусор вида (x = -170345, y = 7624367), а текущая позиция как раз данного персонажа. Тот вполне корректно обрабатывает этот случай (что-то вроде "я и так уже здесь стою, поэтому ничего делать и не надо"). Баг, соответственно, из банального "портится память" превращается в чудовищное "иногда персонаж не делает то, что ему приказано".

У SOneData есть и другие поля, указатели всякие, на карту мира, например. И в них-то, конечно, валится всякий треш. Но вот именно в таком случае никакая карта мира не нужна. Зачем? Мы уже в точке назначения.

То есть еще раз. (Я все никак не налюбуюсь). В довольно редкой ситуации кусок памяти ошибочно интерпретируется. И неожиданным образом именно в этих обстоятельствах он со 100% воспроизводимостью всегда содержит данные, удивительно похожие на то, что от него ожидалось. Но, конечно, неверные.

По уровню правдоподобия очень похоже на сюжет "Иронии судьбы". Но вот бывает, оказывается.

Callbacks

May. 1st, 2007 05:14 pm
plakhov: (Default)

C-style callbacks (указатели на функцию) работают сильно оптимальнее C++ style callback’ов (указателей на объект, реализующий некоторый мааленький интерфейс). Менее важная причина состоит в том, что C-style callbacks используют на один уровень indirection’а меньше. Более важная - в том, что виртуальная таблица хранится один раз для каждого типа, и хранится она «где-то там». А вызов виртуального метода – это обращение сначала к ней, а потом к данным экземпляра, что совсем не cache friendly. И нельзя объяснить компилятору, что вот для этого класса я хочу ее хранить прямо в экземплярах, поскольку она маленькая, а лишний indirection мне не нужен (кстати, а может, какими-нибудь хитрыми pragma'ми можно?)

То есть, С++ и тут показывает свою эклектичную природу. С одной стороны, при помощи placement new и приведения типов я могу располагать данные практически как угодно. С другой, у меня нет никакого контроля над тем, как устроено низкоуровневое представление более продвинутых features языка. Например, что именно хранится в rtti, в каком порядке в бинарное представление кладутся данные parent’ов, как и где хранить виртуальную таблицу (почему бы, скажем, для классов, для которых определен некий pool, не хранить ее рядом с этим pool’ом?) и тд и тп. Да что там говорить, если даже alignment-директивы отличаются от компилятора к компилятору.

Mindpixel

May. 1st, 2007 02:28 pm
plakhov: (Default)
А ведь fixed capacity vector / list можно модифицировать во время итерации по нему (не как угодно, конечно, но, как минимум, push_back/pop_back).
От этого возникает какое-то новое чувство защищенности.
plakhov: (Default)
Знаете ли вы, что выражение ( p->nField == 1234) на Nintendo DS может иметь значение false, хотя при этом в окошечке watches для p->nField написано 1234, типы поля nField - int, ну и побитово в следующих 4 байтах памяти написано как раз-таки число 1234?

Это бывает, когда (int)p не делится на 4.

Я пару дней назад на это наткнулся. Понял, в чем проблема, примерно через два часа. Легко отделался, если учесть что компилятор, линкер и дебаггер молчали и делали вид, что все ок.

Сейчас, наверное, придет [profile] neteraser и скажет, что так и задумано. А потом [info]aruslan с [profile] ddima добьют, отметив, что все правильные поцоны выравнивание проверяют на подсознательном уровне еще с тех времен, когда Atari была небольшим японским стартапом.

Вот расскажите, если кто вдруг знает, как узнавать о подобных граблях до того, как на них наступил?
plakhov: (Default)
DS - это железка, у которой пять процессоров и одиннадцать разновидностей памяти разного объема и предназначения. Каждый из процессоров соединен с частью памятей, и имеет несколько режимов работы. Все эти режимы у разных процессоров частично пересекаются по своим функциям. Пара немножко разных графических процессоров - узкоспециализированные игровые, то есть прямо на уровне железа знают о том, что бывают карты, а бывают персонажи (ну не настолько, но практически). Соответственно, к этому всему прилагается API на 500+ функций. И опциональная библиотека для "упрощения" работы с этим API. Еще на столько же. Реально же использовать и то и другое вперемешку - absolute must (кто бы сомневался).

В коде от всего этого никак толком не абстрагируешься, потому что никакой заметной системы (кроме общего правила "сделать как можно больше разных возможностей") за этим не просматривается.

Надеюсь, никакой strictly confidential информации я тут не разгласил.

Утвердился в мнении, что японцы - нация, полученная в результате скрещивания детей и роботов. То-то и мультики у них такие.

Profile

plakhov: (Default)
plakhov

August 2017

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 22nd, 2017 02:37 am
Powered by Dreamwidth Studios