C ++ компиляторы оптимизируют проход справочными параметрами СТРУЧКА константы в проход копией?

Здесь много замечательных ответов, но я хотел бы добавить свое мнение (на основе того, как мой подход развился)

Отладочные журналы

Посмотрим правде в глаза, мы все любим хороший console.log('Uh oh, if you reached here, you better run.'), и иногда это отлично работает, поэтому, если вы не согласны с тем, чтобы двигаться слишком далеко от него, по крайней мере, добавьте bling в свои журналы с помощью debugg Visionmedia.

Интерактивная отладка

Так же удобно, как ведение журнала консоли, чтобы отлаживать профессионально, вам нужно засучить рукава и застрять. Установите точки останова, выполните свой код, проверите области и переменные, чтобы увидеть, что вызывает это странное поведение. Как отмечали другие, node-inspector действительно является пчелиными колени. Он делает все, что вы можете сделать со встроенным отладчиком, но используя этот знакомый интерфейс Chrome DevTools. Если, как и я, вы используете Webstorm, тогда здесь является удобным руководством для отладки оттуда.

Трассировка стека

По умолчанию мы не можем отслеживать ряд операций в разных циклах цикла событий (тики).

Утечки памяти

С помощью Node.js мы можем иметь серверный процесс Ожидается, что вы останетесь надолго. Что вы делаете, если думаете, что это вызвало некоторые неприятные утечки? Используйте heapdump и Chrome DevTools, чтобы сравнить некоторые снимки и посмотреть, что меняется.


Для некоторых полезных статей посмотрите

Если вы чувствуете, что смотрите видео (ы), затем

Какой бы путь вы ни выбрали, просто убедитесь, что вы понимаете, как вы отлаживаете

Это болезненная вещь. Посмотрите на свою что вы сами и никто другой не сделал это

Sophocles, Ajax

blockquote>

28
задан Emile Cormier 11 January 2010 в 18:58
поделиться

3 ответа

Я не могу говорить за каждый компилятор, но Общий ответ не является . Это не сделает эту оптимизацию.

См. GOTW # 81 Для чтения о том, как кастинг Const в C ++ не влияет на оптимизацию, как некоторые могут подумать.

4
ответ дан 28 November 2019 в 03:55
поделиться

Ваш компилятор может абсолютно поднять переменные-члены Point в регистры, если это необходимо. Это, однако, не то же самое, что компилятор, преобразующий сам вызов функции в передачу по значению.

Вы должны проверить сгенерированную сборку, чтобы увидеть, какие оптимизации выполняются.

И FWIW, общее правило, которое я использую, состоит в том, чтобы передавать все примитивные типы по значению и все классы / UDT (POD или нет) по константной ссылке, когда это возможно, и позволить компилятору разобраться с лучшим вариантом. Мы не должны беспокоиться о деталях того, что делает компилятор, он намного умнее нас.

7
ответ дан Terry Mahaffey 14 October 2019 в 12:06
поделиться

Мартин Фаулер также писал об этих идеях в прошлом под термином « Модель представления ». Таким образом, вы можете найти полезные учебные пособия под этой поисковой фразой, так как это не «изобретенный термин MS».: -)

Действительно, в этом обзорном материале MS признается работа Фаулера непосредственно

В 2005 году Джон Госсман, в настоящее время один WPF и Silverlight Architects в Microsoft, представил Образец Model-View-ViewModel (MVVM) на его блог. MVVM идентичен Модель презентации Фаулера, в этом оба узоров имеют абстракцию представления, которое содержит представление состояние и поведение. Фаулер представил Модель представления как средство создание независимого от платформы пользовательского интерфейса абстракция вида, тогда как Госсман представил MVVM как стандартизированный способ использование основных функций WPF для упрощение создания пользователя интерфейсы. В этом смысле я считаю MVVM будет специализацией более общий образец ТЧ, индивидуальный для платформ WPF и Silverlight.

-121--4817971-

[MS-NRBF]: .NET Удаленное взаимодействие: структура данных в двоичном формате

-121--2557683-

Имеются 2 проблемы.

Во-первых, компилятор не будет преобразовывать pass-by-ref в pass-by-value, особенно если complexComputation не является статическим (т.е. может использоваться внешними объектами).

Причиной является совместимость API. Для ЦП нет такого понятия, как «ссылка». Компилятор будет преобразовывать ссылки на указатели. Параметры передаются в стеке или через регистр, поэтому код, вызывающий complexComputation , скорее всего, будет вызван как (предположим, double имеет длину 4 на мгновение):

str x1, [r7, #0x20]
str y1, [r7, #0x24]
str x2, [r7, #0x50]
str y2, [r7, #0x54]
push r7, #0x20     ; push address of p1 onto the stack
push r7, #0x50     ; push address of p2 onto the stack
call complexComputation

В стек вставляются только 8 байт.

Передача по копии, с другой стороны, будет толкать всю структуру в стек, так что код сборки будет выглядеть как

push x1    ; push a copy of p1.x onto the stack
push y1    ; push a copy of p1.y onto the stack
push x2    ; push a copy of p2.x onto the stack
push y2    ; push a copy of p2.y onto the stack
call complexComputation

Обратите внимание, что на этот раз 16 байтов в стек, а содержимое - это числа, а не указатели. Если complexComputation изменит свой параметр, передающий семантику, входные данные превратятся в мусор, и программа может потерпеть сбой.


С другой стороны, оптимизация

double complexComputation(const Point& p1, const Point& p2) {
    double x1 = p1.x; double x2 = p2.x;
    double y1 = p1.y; double y2 = p2.y;
    // x1, x2, y1, y2 stored in registers and used frequently in computations
}

может быть легко выполнена, поскольку компилятор может распознавать, какие переменные используются очень часто и сохранить их в зарезервированных регистрах (например, r4 _ r13 в архитектуре ARM и многие из регистров sXX/dXX) для более быстрого доступа.


В конце концов, если вы хотите знать, сделал ли компилятор что-то, вы всегда можете разобрать полученные объекты и сравнить.

5
ответ дан 28 November 2019 в 03:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: