2012-02-12 3 views
0

int를 void와 결합해야합니다 *. 내가 좋아하는 일을 생각했다 :int를 void와 결합하기 *

long int lint = ((int)integer<<(sizeof(void*)*8)) | ((void*)ptr); 

하지만 according to my previous message, 긴 INT는 충분하지 않습니다.

누구든지이 방법을 제안 할 수 있습니까?

PS. 어떤 사람들은 왜 내가이 일을하고 싶어할지 묻습니다. 글쎄, 나는 수많은 이벤트를 처리하는 일반적인 이벤트 시스템 (파견/듣기)을 개발 중이다. 준비가되면 나는 ... 코드를 게시 할 예정입니다

+0

int 또는 void 포인터 일 수있는 값을 저장하려고한다는 것을 의미합니까? – LandonSchropp

+3

당신이하려는 것은 무엇이든, 그것은 그 형태로 절망적이지 않습니다. 왜 평범한 오래된'struct'를 쓰지 않습니까? – Mat

+5

왜'struct'를 사용하지 않습니까? : | – amit

답변

1

흠이 뭔가처럼 안 :

long long res = ((long long)integer<<(sizeof(void*))) | ((long long)ptr); 

Thit는 여전히 32 비트 포인터에 대한 작동 및 64 비트 작동하지 않습니다. 이러한 산술에 적합한 기본 제공 유형은 없습니다.

+3

내 경험에 따르면보기가 엉망인 경우 잘못된 해결책입니다. 위의 추한 보인다. –

+0

나는 동의한다. 만약 내가 int와 포인터를 결합해야한다면, 나는이 접근법을 제안하지 않을 것이다. 그러나 질문은 이런 식으로 그들을 결합하는 방법이었습니다. 그래서 저는 그가 제안한 것의 오류만을 지적하고 있습니다. –

+0

@EdHeal "어셈블러"의 사고 방식입니다. :-) –

0

당신은 당신이 많은 사람들이 가지고있는 구조체를 사용해야합니다 위해의 과정은, 64 비트 시스템에서 포인터를 물을 수 없습니다, stdint.h에서 사용할 수 uint_least64_t 같은 것을 사용한다 의견에서 언급했다.

포인터를 사용하는 방식이 이상하게 보일 수도 있지만 실제로 수행 할 작업에 void*을 사용할 필요가없는 것처럼 보입니다. 이벤트 시스템의 경우 다형성을 사용하여 동일한 작업을 수행 할 수 있다는 사실을 염두에 두지 마십시오 당신은 설명했다).

+1

포인터를 유지할 수 있고 동시에 그 이상을 유지할 수는 없으므로 질문에 대한 답변이 아닙니다. – hvd

+0

@hvd : 업데이트 됨, 어떻게 든 int 앞에'long'이 있다는 것을 알지 못했습니다 ... – Necrolis

+0

다른 사람들이 지적했듯이, 충분히 큰 타입이 존재하지 않는다는 가능성이 있습니다. 포인터가 이미 64 비트 인 플랫폼. 'uint_least64_t'도 아니고, 그러한 플랫폼에서는 아마도'uintptr_t'와 같은 타입의 typedef 일 것입니다. – hvd

0

int 또는 void 포인터를 저장할 수있는 데이터 구조를 원하면 union을 사용하십시오. 노동 조합은 그것이 포함하는 최대 가치의 크기가 될 것입니다. 다음과 같이 할 수 있습니다 :

typedef union { 
    void *data, 
    int *value 
} myUnion_t; 

myUnion_t storage; 
int num = 10; 

// if you want to store a void pointer 
storage.data = &num; 

// if you want to store an int 
storage.value = num; 

구조체는 구조체가 아니며 한 번에 하나의 값만 저장해야합니다.

+0

그는 하나의 값이 동시에 유지되기를 원하므로 노동 조합이 정답이 아니다 (정규 구조체). – Sven

+1

아, 그럼이게 무슨 요점 이니? – LandonSchropp

3

유일한 대답은 구조체를 사용하는 것입니다

컴파일러보다 더 똑똑하지 마십시오. 조숙 한 최적화를 수행하지 마십시오. 간단하고 깨끗한 코드를 작성하기 때문에 당신은 너무 느린, 낮은 수준의 최적화

구조체를 수행하는 여기에 더 나은 후에 만 ​​:

  1. 그것은 휴대용
  2. 그것은 그것은 C++ ideomatic
  3. 입니다 안전 .
  4. 더 빠릅니다.입니다.

나는 long long과 struct의 속도를 비교하는 것에 대한 신화를 버리자. 아시다시피 코드를 최적화하는 모든 방법은 프로파일 링으로 시작됩니다.long longstruct S의 벡터의 간단한 프로그램 및 측정 비교 속도를 확인하자 : 1.5 배 빠른

>g++ src.cpp -O3 
>a 
result: 90000; Time: 327 
result: 90000; Time: 188 

예, struct 사용자 정의 operator ==과 :

#include <iostream> 
#include <string> 
#include <vector> 
#include <windows.h> 

struct S 
{ 
    unsigned int a; 
    void* b; 

    bool operator==(const S& other) const 
    { 
     return a == other.a && b == other.b; 
    } 
}; 

template <typename Iterator> 
int count_eq(Iterator begin, Iterator end) 
{ 
    int result = 0; 
    for (Iterator i = begin; i != end; ++i) { 
     for (Iterator j = i + 1; j != end; ++j) { 
      result += *i == *j; 
     } 
    } 
    return result; 
} 

template <typename Iterator> 
void mesure(Iterator begin, Iterator end) 
{ 
    long long t0 = GetTickCount(); 
    int res = count_eq(begin, end); 
    long long t1 = GetTickCount(); 
    std::cout << "result: " << res <<"; Time: "<<(t1-t0)<<"\n"; 
} 

int main() 
{ 
    const unsigned int Size = 20000; 
    std::vector<unsigned long long> l; 
    for (int i = 0; i < Size; i++) { 
     l.push_back(i% (Size/10)); 
    } 

    std::vector<S> s; 
    for (int j = 0; j < Size; j++) { 
     S el; 
     el.a = j% (Size/10); 
     el.b = 0; 
     s.push_back(el); 
    } 

    mesure(l.begin(), l.end()); 
    mesure(s.begin(), s.end()); 
} 

는 검사 결과를 수 있습니다.

+0

아니야! http : // ideone.co.kr/KiNtH 당신이 항상 void * = 0으로 설정 했으므로 컴파일러가 최적화한다고 가정하기 때문에 비교는 건너 뜁니다. –

+0

이것은 특정 컴파일러입니다. 같은 ideone은 내 컴파일러와 마찬가지로'C++ '프로파일에 대한 반대 결과를 보여줍니다. http://ideone.com/uBkPE – Lol4t0

+0

@BillKotsias, 어떻게 확신 할 수 있겠습니까? 그 ideone은 64 비트 플랫폼을 사용하지 않습니다. 여기서 코드는 더 빠르지 만 올바르지 않습니다. ? – Lol4t0