Мне тоже было любопытно, и я вошел в реализацию ядра tf.slice
.
Единственное время, когда память не выделяется, это когда слайс является идентичным слайсом (такбез изменений), и когда срез выровнен по размеру 0.
Линии идентификации
if (is_identity) {
VLOG(1) << "Slice identity";
context->set_output(0, input);
*done = true;
return;
}
Dim0Aligned
if (slice_dim0 &&
IsDim0SliceAligned<T>(input.shape(), (*begin)[0], (*size)[0])) {
VLOG(1) << "Slice dim 0: " << input.shape().DebugString();
CHECK_GE(input.dims(), 1); // Otherwise, is_identity should be true.
context->set_output(0, input.Slice((*begin)[0], (*begin)[0] + (*size)[0]));
*done = true;
return;
}
В противном случае следующее будет называться
OP_REQUIRES_OK(context, context->allocate_output(0, *output_shape, result));