공공 및 비공개 부분이 포함 된 D 모듈을 보유하고 있습니다. 함수 정의 전에 private 키워드와 static 키워드를 사용해 보았습니다. 나는 외부 호출 가능/공개로하고 싶어하고 이상적으로는 호출 사이트에서 인라인 될 수 있기를 바란다. 이 함수는 외부 호출 가능하지 않은 private 인 모듈 내부 함수를 호출합니다. 이것들에 대한 호출은 모듈 내에서 성공적으로 인라이닝되고 많은 cruft는 CTFE와 알려진 상수 전파에 의해 처리됩니다. 그러나 GDC 컴파일러는 필요할 때 어디에서나 인라인 될 수 있고 외부에서 호출 할 수없는 것으로 가정하더라도 이러한 내부 루틴의 사본을 생성합니다. -O3-frelease로 컴파일 중입니다. 내가해야 할 일은 무엇입니까? 정적이거나 사적으로 사용한다고해도 이것을해야합니까?D/DLang : 모듈 전용 비공개 인라인 함수의 코드 생성을 금지합니다.
통찰력을 기대하면서이 thread concerning GCC에 대해 간략히 살펴 보았습니다.
앞에서 언급했듯이이 두 가지 내부 함수를 개인용 및 정적으로 모두 사용하려고했지만 코드 생성을 억제 할 수는 없습니다. 디버거가 중단 점을 설정하기 위해 이러한 루틴을 복사해야 할 필요가 있다면 이것을 이해할 수 있습니다. 링크 타임에서 어떻게 든 정렬 될 수 있음을 강조 할 필요가 있습니다. 프로그램 연결을 시도하지 않았지만 GDC를 사용하는 Matt Godbolt D 컴파일러 탐색기에서 생성 된 코드를보고 있습니다. 모든 것은 템플릿 매개 변수의 길이가 0 인 목록 (예 : auto_fn() (arg_t x))을 사용하여 템플릿으로 만들 수 있습니다. 시도했지만 아무런 해가되지 않습니다.
시도해 볼만한 다른 몇 가지 : 패키지를 구현하는 방법 인 Ada 스타일로 개인 부분으로 정적 클래스를 만들 수 있습니다. (엄격히 싱글 인스턴스가 필요합니다.) 저는 C++을 전혀 해본 적이 없으며 엄청난 양의 asm과 C 만 전문적으로 수행했습니다. 그래서 그것은 학습 곡선이 될 것입니다.
내가 생각할 수있는 유일한 또 다른 점은 중첩 된 함수 정의, 파스칼/에이다 스타일을 사용하여 내부 루틴을 호출자 본문 내부로 이동시키는 것입니다. 그러나 그것은 많은 단점이 있습니다.
거친 예는
module junk;
auto my_public_fn() { return my_private_fn(); }
private
static // 'static' and/or 'private', tried both
auto my_private_fn() { xxx ; return whatever; }
현재 루틴에 일부 GCC 관련 확장 된 asm 코드가 포함되어 있기 때문에 LDC와 GDC를 비교할 수 없었습니다. 나는 원하지 않는 함수 몸체가 asm btw를 포함하는 함수 몸체가 아니라는 것을 알아 차렸다. –
당신은 확실히'정적'이 필요하지 않습니다. 최상위 선언에는 의미가 없습니다. – Cauterite
"나는 프로그램 연결을 시도하지 않았습니다."- GDC에 대해 많이 알지는 못했지만 링크 시간에 dead-code-elimination/COMDAT- 폴딩이 발생하여 이러한 함수가 사라질 수 있습니다. 아마도 GDC는 링커가 어쨌든 그것을 처리 할 것으로 예상되기 때문에이 수준에서 DCE를 시도하지 않습니다. 나는 단지 추측하고 있지만 ... – Cauterite