Отладка неуправляемого кода при отладке управляемого кода

Обновление: теперь это добавлено в документацию для ?copy в версии 1.9.3. Из NEWS :
  1. Перемещено ?copy на свою страницу справки и задокументировано, что dt_names <- copy(names(DT)) необходимо, чтобы dt_names не был изменен ссылку в результате обновления DT по ссылке (например: добавление нового столбца по ссылке). Закрывает # 512 . Благодаря Zach для этот вопрос SO и user1971988 для этот вопрос SO .
blockquote>

Часть вашего первого вопрос делает для меня немного непонятным относительно того, что вы действительно имеете в виду относительно оператора <- (по крайней мере, в контексте data.table), особенно для части: . В других случаях мы явно предупреждают, что & lt; - создает копии, как data.tables, так и data.frames.

Итак, прежде чем отвечать на ваш реальный вопрос, я кратко коснусь его здесь. В случае data.table a <- (присвоение) просто недостаточно для копирования a data.table. Например:

DT <- data.table(x = 1:5, y= 6:10)
# assign DT2 to DT
DT2 <- DT # assign by reference, no copy taken.
DT2[, z := 11:15]
# DT will also have the z column

Если вы хотите создать copy, вы должны явно указать его с помощью команды copy.

DT2 <- copy(DT) # copied content to DT2
DT2[, z := 11:15] # only DT2 is affected

From CauchyDistributedRV, Я понимаю, что вы имеете в виду назначение names(dt) <- ., которое приведет к предупреждению. Я оставлю это как таковой.


Теперь, чтобы ответить на ваш первый вопрос: похоже, что names1 <- names(DT) также ведет себя аналогично. Я до сих пор не думал об этом. Здесь очень полезна команда .Internal(inspect(.)):

.Internal(inspect(names1))
# @7fc86a851480 16 STRSXP g0c7 [MARK,NAM(2)] (len=2, tl=100)
#   @7fc86a069f68 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "x"
#   @7fc86a0f96d8 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "y"

.Internal(inspect(names(DT)))
# @7fc86a851480 16 STRSXP g0c7 [MARK,NAM(2)] (len=2, tl=100)
#   @7fc86a069f68 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "x"
#   @7fc86a0f96d8 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "y"

Здесь вы видите, что они указывают на ту же ячейку памяти @7fc86a851480. Даже truelength из names1 равно 100 (по умолчанию выделено в data.table, для этого нужно проверить ?alloc.col.

truelength(names1)
# [1] 100

Таким образом, назначение names1 <- names(dt) кажется происходят по ссылке. То есть, names1 указывает на то же место, что и указатель имен столбца dt.

Чтобы ответить на ваш второй вопрос: команда c(.), похоже, создает копию , поскольку нет проверки того, что результат содержимого из-за операции конкатенации различен . То есть, поскольку операция c(.) может изменять содержимое вектора, это немедленно приводит к тому, что «копия» сделана без , проверяя, не изменяется ли содержимое.

20
задан JaredPar 25 March 2010 в 21:41
поделиться

2 ответа

По умолчанию управляемый проект запускает отладчик только с включенной управляемой отладкой. При этом не учитывается, что в одном решении есть неуправляемые проекты. Для отладки обоих вам необходимо явно включить отладку неуправляемого кода.

  • Щелкните правой кнопкой мыши проект и выберите свойства.
  • Перейдите на вкладку «Отладка»
  • Установите флажок «Включить отладку неуправляемого кода»
26
ответ дан 30 November 2019 в 00:39
поделиться

В Visual Studio 2019 опция включена следующим образом:

  • Щелчок правой кнопкой по проекту и свойствам выбора
  • Переходит к подменю Debugging в соответствии с Конфигурацией
  • От Типа Отладчика выпадающий выбор значений, Смешанный
0
ответ дан 30 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

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