473,412 Members | 1,873 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,412 software developers and data experts.

classes vs structs.

Hi,

I am currently brushing up my c++ knowledge and I would like to ask you
about the differences between classes and C structs, in the
function/method perspective.

1) Is it correct to say that, a structure definition that includes
function pointers only defines the function prototypes to be used with
them, but not the actual implementations, whereas in C++, member
functions cannot be changed *unless* virtual functions are used, or the
original class is extended with a new one that defines
the same functions with different implementations?

2) Once defined, accessing member functions of a class in C++ has less
overhead thanks to name mangling, compared to the extra pointer
dereference overhead
in C structs with function pointers?

3) It is commonly said that virtual functions reduce performance.
AFAIK, the overhead of virtual functions compared to a function pointer
in a C struct is, only one extra pointer dereference and an addition.
E.g. one dereference to access vtab, and one offset addition and
dereference to access the function itself.

Is it even more than that, otherwise why does virtual functions have
such reputation to reduce performance where C structs with function
pointers are not that much better?

4) Also, isn't there the possibility to optimise the dereference in C
structs, at least if the function pointer is declared `const', i.e. not
to change after the initialisation. The compiler might just recognise
the const initialisation and replace it with a `branch' to the actual
function? Perhaps not a possible option with virtual functions due to
dynamic binding?

5) In a C struct on a 32-bit machine, the size of a struct is the sum
of all fields + maybe some padding; the function pointers take up as
much as a word. In C++ what is the size of a class, perhaps it excludes
sizes of member methods? Is it only the fields? What about static
storage? Does a static member count in every instance of the class? And
const members? Is it implementation defined where consts are stored? If
I wanted to memcpy a class, how much space should I spare? Perhaps it
is undefined behaviour if one manually copied a class and expected to
access its fields as normal?

Many thanks,
Bahadir

Feb 7 '06 #1
5 2874
Bi*************@gmail.com wrote:
I am currently brushing up my c++ knowledge and I would like to ask you
about the differences between classes and C structs, in the
function/method perspective.

1) Is it correct to say that, a structure definition that includes
function pointers only defines the function prototypes to be used with
them,
Huh?
but not the actual implementations, whereas in C++, member
functions cannot be changed *unless* virtual functions are used, or the
original class is extended with a new one that defines
the same functions with different implementations?
No. Incorrect on several levels.
2) Once defined, accessing member functions of a class in C++ has less
overhead thanks to name mangling, compared to the extra pointer
dereference overhead
in C structs with function pointers?
Maybe. Only experimentation can actually show. And then after that, it
still needs to be proven to be of any importance.
3) It is commonly said that virtual functions reduce performance.
AFAIK, the overhead of virtual functions compared to a function pointer
in a C struct is, only one extra pointer dereference and an addition.
E.g. one dereference to access vtab, and one offset addition and
dereference to access the function itself.
I don't think there is dereference to access vtab. I don't think the
paragraph above makes sense.
Is it even more than that, otherwise why does virtual functions have
such reputation to reduce performance where C structs with function
pointers are not that much better?
Because some people like looking for flaws. Did you know that cars have
the reputation of killing their occupants?
4) Also, isn't there the possibility to optimise the dereference in C
structs, at least if the function pointer is declared `const', i.e. not
to change after the initialisation. The compiler might just recognise
the const initialisation and replace it with a `branch' to the actual
function? Perhaps not a possible option with virtual functions due to
dynamic binding?
Actually, if the call to any function even declared 'virtual' is made
non-polymorphically, there is no overhead.
5) In a C struct on a 32-bit machine, the size of a struct is the sum
of all fields + maybe some padding; the function pointers take up as
much as a word. In C++ what is the size of a class, perhaps it excludes
sizes of member methods?
Usually member functions do not contribute to the size of the object.
The most common implementation of virtual function mechanism adds one
pointer to an object of the class with any number of virtual functions.
Is it only the fields? What about static
storage? Does a static member count in every instance of the class?
No.
And
const members?
Depends on the members.
Is it implementation defined where consts are stored? If
I wanted to memcpy a class, how much space should I spare? Perhaps it
is undefined behaviour if one manually copied a class and expected to
access its fields as normal?


I think you need to get and read "Inside the C++ Object Model" by Lippman.

V
--
Please remove capital As from my address when replying by mail
Feb 7 '06 #2
<Bi*************@gmail.com> wrote in message
news:11**********************@f14g2000cwb.googlegr oups.com...
| Hi,
|
| I am currently brushing up my c++ knowledge and I would like to ask you
| about the differences between classes and C structs, in the
| function/method perspective.
|
| 1) Is it correct to say that, a structure definition that includes
| function pointers only defines the function prototypes to be used with
| them, but not the actual implementations, whereas in C++, member
| functions cannot be changed *unless* virtual functions are used, or the
| original class is extended with a new one that defines
| the same functions with different implementations?
|
| 2) Once defined, accessing member functions of a class in C++ has less
| overhead thanks to name mangling, compared to the extra pointer
| dereference overhead
| in C structs with function pointers?
|
| 3) It is commonly said that virtual functions reduce performance.
| AFAIK, the overhead of virtual functions compared to a function pointer
| in a C struct is, only one extra pointer dereference and an addition.
| E.g. one dereference to access vtab, and one offset addition and
| dereference to access the function itself.
|
| Is it even more than that, otherwise why does virtual functions have
| such reputation to reduce performance where C structs with function
| pointers are not that much better?
|
| 4) Also, isn't there the possibility to optimise the dereference in C
| structs, at least if the function pointer is declared `const', i.e. not
| to change after the initialisation. The compiler might just recognise
| the const initialisation and replace it with a `branch' to the actual
| function? Perhaps not a possible option with virtual functions due to
| dynamic binding?
|
| 5) In a C struct on a 32-bit machine, the size of a struct is the sum
| of all fields + maybe some padding; the function pointers take up as
| much as a word. In C++ what is the size of a class, perhaps it excludes
| sizes of member methods? Is it only the fields? What about static
| storage? Does a static member count in every instance of the class? And
| const members? Is it implementation defined where consts are stored? If
| I wanted to memcpy a class, how much space should I spare? Perhaps it
| is undefined behaviour if one manually copied a class and expected to
| access its fields as normal?
|
| Many thanks,
| Bahadir

There is very little difference between classes and structs in C++.
Anything you can do in a class you can do in a struct, and vice versa.
Structs are C baggage carried over to C++ and replaced by the class. The
only discernable difference is that ALL members of a struct are public by
default, and ALL members of a class are private by default. I still use the
typedef struct style in C++ to point out to the reader that I intend to use
this as a data container only, even though it might have some intelligence
built in about its data. Note that it is considered very bad style to
polymorph structs - you should use classes for that.

Cheers

Feb 7 '06 #3
On Tue, 7 Feb 2006 09:22:44 -0800, "Ed Weir \(ComCast\)"
<An**@Maus.duh> wrote:
There is very little difference between classes and structs in C++.
Anything you can do in a class you can do in a struct, and vice versa.


The OP's question possibly is:

struct S {
void (*foo) (int);
};

vs.

class C1 {
public:
void foo (int);
};

vs.

class C2 {
public:
virtual void foo (int);
};

Feb 7 '06 #4
Roland Pibinger wrote:
On Tue, 7 Feb 2006 09:22:44 -0800, "Ed Weir \(ComCast\)"
<An**@Maus.duh> wrote:
There is very little difference between classes and structs in C++.
Anything you can do in a class you can do in a struct, and vice versa.

The OP's question possibly is:

struct S {
void (*foo) (int);


Actually, you'd probably need to make it

void (*foo) (struct S*, int);

to match C++ functionality. After all, what if 'S' has data members?
};

vs.

class C1 {
public:
void foo (int);
};

vs.

class C2 {
public:
virtual void foo (int);
};


V
--
Please remove capital As from my address when replying by mail
Feb 7 '06 #5
On Tue, 07 Feb 2006 16:18:02 -0500, Victor Bazarov
<v.********@comAcast.net> wrote:
Roland Pibinger wrote:
The OP's question possibly is:

struct S {
void (*foo) (int);


Actually, you'd probably need to make it

void (*foo) (struct S*, int);

to match C++ functionality. After all, what if 'S' has data members?


You are right!
Feb 7 '06 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Brad Tilley | last post by:
I don't understand classes very well... maybe some day. Is it just me or are they supposed to be difficult to understand? They make my head hurt. Anyway, because I don't understand classes well,...
14
by: Pratts | last post by:
I am a new one who have joined u plz try to help me bcoz i could not find ny sutiable answer foer this Question Qus>>why do we need classes when structures provide similar functionality??
4
by: Bill | last post by:
I would like to create a static array of classes (or structs) to be used in populating name/value pairs in various WebForm drop down list boxes, but am not quite sure of the construct (or rather to...
4
by: Christopher Ireland | last post by:
Hi -- I'm trying to find an example of a nested class implemented within the .NET Framework itself but without much success. I don't suppose that anybody knows of such an example off the top of...
2
by: Kiran A K | last post by:
Hi, can anyone give specific examples where structs are preferred to classes?
7
by: Markus Svilans | last post by:
Hi, What is the difference between having a struct with constructors and methods versus a class? In many C++ examples online I have seen code similar to this: struct Animal { Animal()
5
by: giddy | last post by:
hi , i'm a C / C# programmer .. have'nt done C++, in C# .. . object instances of classes ( TextBox txt = new TextBox();) are reference types. Structs on the other hand are value types. In...
29
by: Dom | last post by:
I'm really confused by the difference between a Struct and a Class? Sometimes, I want just a group of fields to go together. A Class without methods seems wrong, in that it carries too much...
19
by: desktop | last post by:
There is a lot of info on this topic on google. But in Bjarne Stroustrup 's book page 225 he writes: "The declaration of Date in the previous subsection (declared as a struct) provides a set of...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.