Точный механизм зависит от платформы. Но наиболее распространенным механизмом является то, что вызывающий абонент выделяет пространство в своем стеке для возвращаемой структуры и передает адрес этого пространства в качестве дополнительного аргумента, обычно перед всеми реальными аргументами.
На многих платформах, структуры, достаточно маленькие, чтобы вписаться в регистр, будут возвращены, как если бы они были единственным значением. Это применимо к x86-64 для структуры, состоящей из двух 32-разрядных int
s, поскольку они могут быть возвращены в одном 64-битном регистре. Как большая структура может быть обработана таким образом, будет варьироваться от платформы к платформе.
Стоимость передачи больших структур по стоимости может быть улучшена с помощью копирования. Если, например, вы пишете
struct MyThingy blob = blobMaker();
, компилятор, скорее всего, передаст blobMaker
адрес переменной blob
вместо выделения временной переменной, а затем скопирует временное значение в blob
после функция возвращается. Вызываемая функция также может избежать копирования:
struct MyThingy blobMaker(void) {
struct MyThingy retval;
// ...
retval.member1 = some_calc(42);
// ...
retval.member2 = "Hello";
// ...
return retval;
Здесь компилятор мог бы не выделять retval
в стек стека вызываемой функции, а вместо этого просто использовать хранилище, переданное в невидимом аргумент напрямую, тем самым избегая копирования на return
. Комбинация этих двух оптимизаций (когда это возможно) делает возвращающие структуры почти бесплатными.
Стандарт C ++ обеспечивает эти оптимизации, явно разрешая их даже в тех случаях, когда разрешенные копии могли вызвать побочные эффекты в копии объекта конструктор. (Очевидно, этот случай не существует в C.)
Вы ищете свойство plotOptions.column.allowPointSelect : API - allowPointSelect
Просто обновите строку 25 в своем коде:
hc_plotOptions(series = list(stacking = FALSE, allowPointSelect = TRUE, events = list(click = canvasClickFunction, legendItemClick = legendClickFunction))) %>%
Чтобы выбрать более 1 точки, удерживайте нажатой кнопку ctrl .