Это то, что java может сделать, а c не может? - PullRequest
0 голосов
/ 09 января 2020

Когда мы используем массив Dynami c в Java, например a = new int[n], n - аргумент, передаваемый методу, можно Java использовать escape-анализ и распределять этот массив длины Dynami c на стек вместо кучи? И может ли c сделать это? Я имею в виду, может ли C выделить динамический массив c длины в стеке или он должен быть в стеке? Это где Java лучше, чем C?

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Теоретически Java может принять решение во время выполнения, выполнять ли распределение в стеке (на основе Escape-анализ и, если требуется, распределение ниже определенного порога) или выделить в кучу.

Однако это теоретически. Чтобы проверить, выполняет ли ваша JVM эту оптимизацию для непостоянных значений, вы можете выполнить тест, предложенный в следующем SO ответе для другого вопроса по Escape-анализу в Java.

1 голос
/ 09 января 2020
  1. HotSpot JVM вообще не выполняет "распределение стека". Вместо этого он имеет Скалярная замена оптимизация.
  2. HotSpot JVM может применить скалярную замену к массивам, но только если длина равна константе не больше EliminateAllocationArraySizeLimit (по умолчанию равно 64), см. escape. cpp:
    if (call->is_AllocateArray()) {
      if (!cik->is_array_klass()) { // StressReflectiveCode
        es = PointsToNode::GlobalEscape;
      } else {
        int length = call->in(AllocateNode::ALength)->find_int_con(-1);
        if (length < 0 || length > EliminateAllocationArraySizeLimit) {
          // Not scalar replaceable if the length is not constant or too big.
          scalar_replaceable = false;
        }
      }
...