Directx Δημοσ. 20 Σεπτεμβρίου 2009 Δημοσ. 20 Σεπτεμβρίου 2009 Εχεις δικαιο, ξεχασα να σου πω ευχαριστω. Σε ευχαριστω* *Το εννοω Να είσαι καλά! Αν χρειασθείς κάτι άλλο και γνωρίζω επ' αυτού εδώ θα είμαι, ειλικρινά καλή συνέχεια στο πρόγραμμα σου!!
Evgenios1 Δημοσ. 20 Σεπτεμβρίου 2009 Μέλος Δημοσ. 20 Σεπτεμβρίου 2009 Εχει καποια "διαφορα" αν ανεβασεις μια κλαση σε stack αντι heap? Αν εχει, που μπορω να διαβασω περι του θεματος? πχ εχω κανει αυτη εδω, που με βολευει αρκετα h >[color="#0000ff"]#pragma[/color] once [color="#0000ff"]#include[/color] <winsock2.h> [color="#0000ff"]#pragma[/color] comment(lib,[color="#a31515"]"ws2_32.lib"[/color]) [color="#0000ff"][b]class[/b][/color] Socket { [color="#0000ff"][b]protected[/b][/color]: SOCKET PTR; [color="#0000ff"][b]public[/b][/color]: Socket([color="#8000ff"]int[/color] af,[color="#8000ff"]int[/color] dtype); Socket(SOCKET ptr); Socket([color="#0000ff"][b]void[/b][/color]); ~Socket([color="#0000ff"][b]void[/b][/color]); [color="#0000ff"][b]void[/b][/color] Bind([color="#0000ff"][b]const[/b][/color] [color="#8000ff"]char[/color] *ip, [color="#8000ff"]int[/color] port); [color="#0000ff"][b]void[/b][/color] Connect([color="#0000ff"][b]const[/b][/color] [color="#8000ff"]char[/color] *ip, [color="#8000ff"]int[/color] port); [color="#0000ff"][b]void[/b][/color] Listen([color="#8000ff"]int[/color] ; Socket Accept([color="#0000ff"][b]void[/b][/color]); [color="#0000ff"][b]void[/b][/color] Send([color="#0000ff"][b]void[/b][/color]* buf,[color="#8000ff"]int[/color] sz_element,[color="#8000ff"]int[/color] count); [color="#0000ff"][b]void[/b][/color] Receive([color="#0000ff"][b]void[/b][/color]* buf, [color="#8000ff"]int[/color] sz_element,[color="#8000ff"]int[/color] count); [color="#0000ff"][b]void[/b][/color] Close([color="#0000ff"][b]void[/b][/color]); }; cpp >[color="#0000ff"]#include[/color] [color="#a31515"]"StdAfx.h"[/color] [color="#0000ff"]#include[/color] [color="#a31515"]"Socket.h"[/color] Socket::Socket([color="#0000ff"][b]void[/b][/color]) { PTR = [color="#ff8000"]0[/color]; } Socket::Socket(SOCKET ptr) { WSAData wd; [color="#0000ff"][b]if[/b][/color](WSAStartup(MAKEWORD([color="#ff8000"]2[/color],[color="#ff8000"]2[/color]),&wd) == SOCKET_ERROR) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to create socekt."[/color]; PTR = ptr; } Socket::Socket([color="#8000ff"]int[/color] af,[color="#8000ff"]int[/color] dtype) { WSAData wd; [color="#0000ff"][b]if[/b][/color](WSAStartup(MAKEWORD([color="#ff8000"]2[/color],[color="#ff8000"]2[/color]),&wd) == SOCKET_ERROR) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to create socekt."[/color]; PTR = socket(af,dtype,[color="#ff8000"]0[/color]); [color="#0000ff"][b]if[/b][/color](PTR == INVALID_SOCKET) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to create socket."[/color]; } Socket::~Socket([color="#0000ff"][b]void[/b][/color]) { Socket::Close(); } [color="#0000ff"][b]void[/b][/color] Socket::Bind([color="#0000ff"][b]const[/b][/color] [color="#8000ff"]char[/color] *ip,[color="#8000ff"]int[/color] port) { SOCKADDR_IN endpoint; endpoint.sin_family = AF_INET; endpoint.sin_port = htons(port); endpoint.sin_addr.s_addr = inet_addr(ip); [color="#0000ff"][b]if[/b][/color](bind(PTR,(SOCKADDR*)&endpoint,[color="#0000ff"][b]sizeof[/b][/color](endpoint)) == SOCKET_ERROR) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to bind socket."[/color]; } [color="#0000ff"][b]void[/b][/color] Socket::Connect([color="#0000ff"][b]const[/b][/color] [color="#8000ff"]char[/color] *ip, [color="#8000ff"]int[/color] port) { SOCKADDR_IN endpoint; endpoint.sin_family = AF_INET; endpoint.sin_port = htons(port); endpoint.sin_addr.s_addr = inet_addr(ip); [color="#0000ff"][b]if[/b][/color](connect(PTR,(SOCKADDR*) &endpoint,[color="#0000ff"][b]sizeof[/b][/color](endpoint))== SOCKET_ERROR) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to connect."[/color]; } [color="#0000ff"][b]void[/b][/color] Socket::Listen([color="#8000ff"]int[/color] l) { [color="#0000ff"][b]if[/b][/color](listen(PTR,l)== SOCKET_ERROR) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to listen."[/color]; } Socket Socket::Accept([color="#0000ff"][b]void[/b][/color]) { SOCKET temp = accept(PTR,NULL,NULL); [color="#0000ff"][b]if[/b][/color](temp == SOCKET_ERROR) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to accept."[/color]; Socket s(temp); [color="#0000ff"][b]return[/b][/color] s; } [color="#0000ff"][b]void[/b][/color] Socket::Send([color="#0000ff"][b]void[/b][/color] *buf, [color="#8000ff"]int[/color] sz_element, [color="#8000ff"]int[/color] count) { [color="#0000ff"][b]if[/b][/color](buf==NULL) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to send data (buffer is null)."[/color]; [color="#0000ff"][b]if[/b][/color](send(PTR,([color="#8000ff"]char[/color]*)buf,sz_element * count,[color="#ff8000"]0[/color])==SOCKET_ERROR) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to send data."[/color]; } [color="#0000ff"][b]void[/b][/color] Socket::Receive([color="#0000ff"][b]void[/b][/color] *buf, [color="#8000ff"]int[/color] sz_element, [color="#8000ff"]int[/color] count) { [color="#0000ff"][b]if[/b][/color](buf==NULL) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to Receive (buffer is null)."[/color]; [color="#0000ff"][b]if[/b][/color](recv(PTR,([color="#8000ff"]char[/color]*)buf,sz_element * count,[color="#ff8000"]0[/color]) == SOCKET_ERROR) [color="#0000ff"][b]throw[/b][/color] [color="#a31515"]"Field to Receive."[/color]; } [color="#0000ff"][b]void[/b][/color] Socket::Close([color="#0000ff"][b]void[/b][/color]) { [color="#008000"][i]//closesocket(PTR);[/i][/color] [color="#008000"][i]//WSACleanup();[/i][/color] } Δηαλαδη τι θα κερδισω αν την εχω στη stack? ΥΓ:Η Stack ειναι allocated ή η heap ?
bxenos Δημοσ. 20 Σεπτεμβρίου 2009 Δημοσ. 20 Σεπτεμβρίου 2009 η heap είναι allocated. η stack είναι για προσωρινή αποθήκευση (και δέσμευση μικρών αντικειμένων, με διάρκεια ζωής στο block {} που δηλώθηκαν). η stack έχει πιο απλή και γρήγορη διαχείρηση (οι επεξεργαστές έχουν ενσωματωμένους register για τη διαχείρηση της), είναι όμως συνήθως περιοριμένη (στα παλιά λειτουργικά ή embeded συστήματα αρκετά, στα καινούργια όμως μπορεί να αλλάζει δυναμικά και να μεγαλώνει) Ειναι θέμα δικό σου, της λειτουργίας της class και της επιθυμιτης διαρκειας ζωης του instance που θα το βάλεις. Οι constructors/destructors φυσικά παίζουν κανονικά.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.