죄송합니다 보폭과 인덱스 작업은,이 배열D 동적 배열 초기화,
에 대한 3 배 질문했다나는 (동적) 배열, D 진정으로 강력한 생각하지만, 다음 잠시 동안 날 귀찮게되었습니다 :
C++에서는 지정된 값으로 배열을 쉽게 할당 할 수 있지만 DI에서는 그렇게 할 수있는 방법을 찾지 못했습니다. 분명히 다음은 문제가되지 않습니다 :
int[] a = new int[N];
a[] = a0;
하지만, 비효율적 보이는 라인부터 하나 a0
으로 추천을 0
으로 초기화하고 있습니다. D에서 다음과 비슷한 것을 할 수 있습니까?
int[] a = new int(a0)[N]; // illegal
std.range에서 보폭을 사용할 때 내가 가진 또 다른 효율성 문제 :
import std.stdio;
import std.range;
struct S
{
int x;
this(this)
{
writeln("copy ", x);
}
}
void f(S[] s)
{
}
int main()
{
S[] s = new S[10];
foreach (i, ref v; s)
{
v.x = i;
}
f(stride(s, 3)); // error
return 0;
}
가 확실히 나는 단순히 요소의 복사하지 않고 새로운 배열을 만들기 위해 보폭을 사용할 수 순진한 생각이었다? D에서 그렇게하는 방법은 없습니다. 맞습니까?
그래서 내가 가서 보폭이 반환로 배열 인 것처럼 시뮬레이션 등과 같은
f
을 구현 :
f(s, 3);
void f(S[] s, uint stride)
{
ref S get(uint i)
{
assert (i * stride < s.length);
return s[i * stride];
}
for (uint x ...)
{
get(x) = ...;
}
}
인덱스 연산자를 사용하는 대신 얻을 작성하는 방법 (X)이있을 것 get[x]
? 이렇게하면 strideing get
함수를 정적으로 mixin/include 할 수 있고 나머지 함수는 비슷하게 유지할 수 있습니다. 로컬 구조체가 함수 범위 변수에 액세스 할 수 없기 때문에 (즉, 왜?) 접근 방식에 관심이 있습니다.
읽어 주셔서 감사합니다. 어떤 구조에서는 약간의 성능 손실이 있지만 (아마도 나는 그들을 남용합니다.) 코드는 훨씬 깔끔하고 일반적인 것입니다. opIndex와 opIndexAssign의 차이점은 opIndex가 단순히 ref를 반환 할 수없는 이유는 무엇입니까? –
성능 문제가 해결되었습니다. C lib의 배열을 포인터에서 Range로 변환하면 코드가 더 깨끗해진다. 속도 차이는 발견되지 않았습니다. –
'void f (범위) (...)'는 제약을 받아야합니다. 'isInputRange'? –