2013-05-21 2 views
2

sizeofstruct 자체에서 사용할 때 같은 크기를 반환하지 않는 이유는 무엇입니까?여러 캐스트의 크기

작동중인 winsock 프로그램 때문에이를 캐스팅해야합니다. 도움을 주셔서 감사합니다.

#include <iostream> 
#include <string> 
using namespace std; 
struct stringstruct 
{ 
    string s1; 
    string s2; 
}; 
int main() 
{ 
    stringstruct ss = {"123","abc"}; 
    char *NX = (char*)&ss; 
    cout << sizeof(NX) << endl << sizeof(*NX) << endl; 
    cout << sizeof(&ss) << endl << sizeof(ss) << endl; 
    getchar(); 
    return 0; 
} 

당신에게 주어진 표현의 유형의 크기를 말할 것이다 출력

4 
1 
4 
64 
+1

포인터는 일반적으로 포인 티와 크기가 다르기 때문에? –

+0

힌트 : 네트워크 (또는 다른 것)를 통해'std :: string '을 보내려고하면 예상대로 작동하지 않습니다. 객체의 실제 문자열은 보내지 않으며 객체 (실제 문자열의 _pointer_를 포함) 만 전달합니다. –

답변

6

sizeof 위의 예. sizeof(NX)sizeof(&ss) 모두에서 시스템의 포인터가 4 바이트를 차지하므로 결과는 4입니다. sizeof(*NX)를 들어, 당신은 당신에게 char을 제공하는하는 char*를 역 참조하고, 당신은 당신이 sizeof(ss)을 수행 할 때 1. ssstringstruct입니다 출력을 얻을 수 있도록 크기를 얻을 수 있도록 char는 1 바이트를 차지 (항상 않습니다) stringstruct인데 64 바이트 인 것으로 보입니다.

+0

그래서 변수의 크기를 얻는 방법은 무엇입니까? (인스턴스가 사용하고있는 공간) – true

+0

어떤 변수가 있습니까? 'ss '의 크기는'sizeof (ss)'입니다. –

+0

NX에서 ss 크기를 가져올 수 없습니까? – true

0

포인터의 크기가 4인데 (귀하의 경우 32 비트 인 것처럼 보입니다). 반면에 객체 자체의 크기는 해당 구조의 객체가 취하는 실제 바이트 수를 반환합니다.

+0

음, 제 시스템은 64 비트입니다. 방금 32로 컴파일되었습니다. – true

+0

수정되었습니다. 거기에 내 말씨가 바뀌었다. –

2
stringstruct ss = {"123","abc"}; 
char *NX = (char*)&ss; 
cout << sizeof(NX) << endl << sizeof(*NX) << endl; 
cout << sizeof(&ss) << endl << sizeof(ss) << endl; 

저는이 캐스트 중 아무 것도 의미가 없다고 확신합니다. NX은 구조체의 시작 부분을 가리 킵니다. 구조체 내부에는 string 유형의 두 객체가 있으며, 차례대로 "123""abc"으로 초기화 된 데이터를 가리키는 포인터가 있습니다. sizeof(*NX)은 그 크기가 char이고, sizeof(NX)은 실제로 포인터의 크기입니다. sizeof(ss)은 두 문자열 멤버 (및 컴파일러에서 추가 한 모든 패딩)의 크기입니다. sizeof(&ss)은 stringstruct에 대한 포인터 크기입니다.

이제 네트워크를 통해 두 개의 별도 문자열로 데이터 ("123""abc")를 보내는 것이 좋습니다. 위의 어느 것도 도움이되지 않습니다. 왜냐하면 sizeof(ss)이 전송하려는 데이터 구조의 크기를 제공하더라도 문자열 값은 해당 구조 [1] 내에 있지 않기 때문입니다. 정말 필요한 것은 serialization을 호출하는 것입니다. 문자열을 텍스트/문자열과 별도의 요소로 작성하는 것입니다. 이 같은

뭔가 작동합니다 :

struct stringstruct { 
    string s1; 
    string s2; 
    string to_string() 
} 

string stringstruct::to_string() 
{ 
    string res = s1 + " " + s2; 
    return res; 
} 

다음과 같은 to_string을 사용

string temp = ss.to_string(); 
const char *to_send = temp.c_str(); 
int send_len = temp.length(); 
... send the string `to_send` with number of bytes `send_len`. 

[1] std::string 실제로 실제 클래스 자체 내에서 짧은 문자열을 저장하는 최적화 있습니다. 그러나 충분히 강하게 주어진다면, 그렇게하지 않을 것입니다.