Структура по сравнению с Классом долгое время жила объекты

Существует некоторый вопрос относительно того, что именно мы знаем о положении желаемого поля, но если мы знаем, что это 4-е / -отделенное поле или 3-е от последнего, мы можем использовать (1) или (2) соответственно. (Если ни один из них не может быть принят, пожалуйста, уточните, как именно мы знаем, какое поле желательно.)

1) read.table Использование вектора символов ss в примечании ниже в качестве ввода мы можем использовать read.table, если знаем, что искомое поле находится между третьей и четвертой косой чертой.

read.table(text = ss, sep = "/", fill = TRUE, as.is = TRUE)[[4]]
## [1] "nameofpage" "nameofpage"

1a) Используя separate:

library(tidyr)

separate(data.frame(ss), ss, c(NA, NA, NA, "target"), sep = "/", extra = "drop")
##       target
## 1 nameofpage
## 2 nameofpage

2) dirname / basement Мы можем использовать dirname и basename, если мы знаем, что требуемое поле является третьим прошедшим полем:

basename(dirname(dirname(ss)))
## [1] "nameofpage" "nameofpage"

Примечание

s <- "https://www.facebook.com/nameofpage/posts/13142894231"
ss <- c(s, s)
15
задан Joan Venge 3 March 2009 в 21:57
поделиться

6 ответов

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

Некоторые подсказки:

:: Структура не должна быть больше, чем 16 байтов, или Вы теряете преимущества производительности.

:: Сделайте структуру неизменной. Это делает использование более четким.

Пример:

public struct Point3D {

   public float X { get; private set; }
   public float Y { get; private set; }
   public float Z { get; private set; }

   public Point3D(float x, float y, float z) {
      X = x;
      Y = y;
      Z = z;
   }

   public Point3D Invert() {
      return new Point3D(-X, -Y, -Z);
   }

}
34
ответ дан 1 December 2019 в 00:33
поделиться

Большое беспокойство - выделяется ли память на стеке или "куче". Структуры входят в стек по умолчанию, и стек обычно намного более ограничен с точки зрения пространства. Так создавая целый набор структур точно так же, как это может быть проблемой.

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

2
ответ дан 1 December 2019 в 00:33
поделиться

Ответ зависит от того, где объекты/значения будут в конечном счете сохранены. Если они должны быть сохранены в невведенном наборе как ArrayList, то Вы заканчиваете тем, что упаковали их. Упаковка создает объектную обертку для структуры, и место совпадает с с объектом класса. С другой стороны, если Вы используете типизированный массив как T [], или Список, затем с помощью структур будет только хранить фактические данные для каждого элемента с местом для всего набора только и не его элементов.

Таким образом, структуры более эффективны для использования в T [] массивы.

5
ответ дан 1 December 2019 в 00:33
поделиться

Как правило, большие массивы неискаженных (т.е. неразделенный) данные того же типа лучше всего хранятся в структурах для производительности, так как Вы сокращаете количество косвенности. (См. также when-are-structs-the-answer). Точное различие в производительности между классом и структурой зависит от Вашего использования. (Например, в операциях сделайте Вас только части доступа структуры? Вы делаете большое временное копирование? Если структура является маленькой, вероятно, всегда лучше использовать, но если это является большим, создавание временных копий может замедлить Вас. При создании этого неизменным, необходимо будет всегда копировать все это для изменения значения.)

Когда в сомнении, мере.

Так как Вы интересуетесь возможными долгосрочными эффектами, которые не могут быть очевидными таким измерением, знать, что такие массивы, вероятно, хранятся на "куче" для больших объектов и должны быть снова использованы вместо уничтоженного и перераспределенного. (см. CRL Наизнанку: Открытая "Куча" для больших объектов.)

Когда передающие структуры большего размера в вызовах Вы могли бы хотеть передать их с касательно аргумента, чтобы не копировать.

2
ответ дан 1 December 2019 в 00:33
поделиться

Структура кажется правильным для этого приложения.

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

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

Используя класс для миллионов этих типов данных, вероятно, было бы дорогим в объеме сдвига разыменования, которое будет, вероятно, происходить для операций на этом типе.

2
ответ дан 1 December 2019 в 00:33
поделиться

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

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

1
ответ дан 1 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

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