2012-01-28 6 views
1

C++에서는 싱글 톤 클래스를 사용하고 다른 클래스의 유일한 인스턴스를 참조합니다. 큰 데이터 구조이므로이 인스턴스에 액세스하는 가장 효율적인 방법은 무엇입니까 궁금하네요. 나는이 것을 고려했다. 를하는싱글 톤 클래스를 사용하는 가장 효율적인 방법

Singleton* singleInstance; 

SingletonUser::SingletonUser() 
{ 
    singleInstance = Singleton::getInstance(); //passes the single instance by reference, then it will be used in the class wherever needed 
} 
  • :

    1. 싱글 클래스를 사용하여 내 두 번째 클래스의 전역 인스턴스를 사용하여 값
    2. 하여 데이터 구조를 전달하는 대신, 다른 싱글 클래스 참조를 얻기 두 번째 클래스의 함수 내에서 같은 일을하므로 싱글 톤 클래스의 인스턴스에 대한 참조를 얻을 수 있습니다 (여러 함수에서 여러 번 액세스해야 함).

    어떤 실습이 가장 적합한 지 잘 모르겠습니다. 누군가가 설명 할 수 있고, 더 효율적인 방법이 있다면, 그것도 설명하십시오.

    감사합니다.

  • +2

    을 : 코드의 다음

    Singleton& Singleton::getInstance() { return *singleton; } 

    : 가능하면 첫째 C에서 –

    +0

    @ André Caron : 시간. Singleton 클래스는 꽤 ​​큰 데이터 구조를 가지고 있습니다. 그것이 내가 참고로 지나가는 것을 생각한 이유입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? – Izza

    +2

    @Izza :하지만 값으로 전달하지 않으면 복사본이 만들어지지 않습니다. (그렇다면 처음에는 싱글 톤이 아닐 것입니다). 참조를 반환하는 것 외에 다른 방법은 염두에 두셨습니까? – Cameron

    답변

    3

    싱글 톤 인스턴스를 값으로 전달하는 경우에는 실제로 싱글 톤이 아닙니다. 그렇습니까?

    액세스해야 할 때마다 인스턴스에 대한 참조 (또는 포인터)를 반환하면됩니다 (1 번). 각 클라이언트에 대해 참조를 한 번 캐싱하면 복잡성이 추가되고 거의 확실하게 더 빠를 수는 없습니다.

    복잡성 추가 외에도 # 1과 # 3의 차이점을 잘 모르겠습니다. 두 함수 모두 참조/포인터를 통해 싱글 톤 인스턴스에 액세스하는 함수를 사용합니다.

    +0

    나는 수업 중에 여러 번 해봐야한다면 캐쉬하는 것이 더 낫다는 인상을 받았다. 하지만 당신이 의미하는 바를 봅니다. 그것은 각 사용자를 위해 일어날 것이기 때문에, 다량 유용하지 않을 것이다. 감사! – Izza

    +0

    @Izza :하지만 당신은 포인터를 캐싱 할 것입니다! 싱글 톤 클래스 대신 인스턴스에서 포인터를 얻는 것이 더 빠를 수 있을까요? – Cameron

    +0

    예, 알겠습니다. 좋은 방법은 아닙니다. expalnation 주셔서 감사합니다. – Izza

    1

    옵션 # 3이 가장 좋습니다. 불필요하게 참조를 캐시하지 마십시오. 캐시 된 참조는 시간이 지남에 따라 유지 관리 부담이됩니다.

    그리고 일반적으로 싱글 톤 패턴을 피하십시오. C++에서 전역 함수 (비회원)는 마찬가지로 좋으며 설계가 진화 할 수 있습니다. 경우`의 getInstance()는이`방법이 2에서와 같이 포인터를 반환

    Singleton& st = Singleton::getInstance(); 
    st.someFunction(); 
    
    +2

    # 3을 올바르게 읽으면 각 클라이언트 인스턴스에 대해 참조를 한 번 캐싱합니다 (# 1은 클래스 자체에서 참조를 가져 오는 반면). – Cameron

    +1

    @Cameron : 당신이 옳을 수도 있습니다. 그렇다면 # 1을 의미합니다. 어쨌든, 불필요한 캐싱 == 나쁜. – mcmcc

    +0

    @mcmcc : 글로벌 기능보다 싱글 톤이 더 좋습니다. 전역 함수가 Singleton보다 나은 이유는 무엇입니까? – Izza

    2

    는 ++ 대신 참조로 전달 포인터를 피하기 예를 들어 객체의 크기에 관계없이`getInstance()`메소드를 호출하고 포인터를 복사하는 데 드는 비용 만 지불하면됩니다. 정확히 무엇을 최적화하려고합니까?
    관련 문제