POD initialization

P

pallav

I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());

#define DELAY_VALUE_NOT_GIVEN -7654321.0

typedef boost::shared_ptr<struct PinDelay> PinDelayPtr

struct DelayTime
{
double rise;
double fall;

DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay
{
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;

PinDelay();

PinDelay::pinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable
{
double slope;
unsigned int npinset;
std::vector<double> pins;
};

struct DelayCircuitImpl
{
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::pinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
: dc(new DelayCircuitImpl())
{
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}

Since the struct contain POD (plain old data), I would think they
should be initialized to 0. However, I am not sure why the variable
'npinset' does not get a default value of 0. In my gdb output, I have
the following:
gdb) p *(*dc).dc
$4 = {
defarr = {
rise = -7654321,
fall = -7654321
},
defreq = {
rise = -7654321,
fall = -7654321
},
wltable = {
slope = -7654321,
npinset = 6311712,
pins = {
<std::_Vector_base<double,std::allocator<double> >> = {
_M_impl = {
<std::allocator<double>> = {
<__gnu_cxx::new_allocator<double>> = {<No data fields>},
::_Vector_impl:
_M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0
}
}, <No data fields>}
},
pipomodel = {
px = 0x602960,
pn = {
pi_ = 0x6029b0
}
}
}

Everything looks good except, npinset has a garbage value. Is there
something I am not understanding about POD initialization? Something
in my code that is preventing npinset to be initialized to 0? Any
clarification is appreciation.

Thanks for your time.
 
?

=?ISO-8859-1?Q?Erik_Wikstr=F6m?=

I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());

#define DELAY_VALUE_NOT_GIVEN -7654321.0

typedef boost::shared_ptr<struct PinDelay> PinDelayPtr

struct DelayTime
{
double rise;
double fall;

DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay
{
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;

PinDelay();

PinDelay::pinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable
{
double slope;
unsigned int npinset;
std::vector<double> pins;
};

struct DelayCircuitImpl
{
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::pinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
: dc(new DelayCircuitImpl())
{
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}

Since the struct contain POD (plain old data), I would think they
should be initialized to 0. However, I am not sure why the variable
'npinset' does not get a default value of 0. In my gdb output, I have
the following:
gdb) p *(*dc).dc
$4 = {
defarr = {
rise = -7654321,
fall = -7654321
},
defreq = {
rise = -7654321,
fall = -7654321
},
wltable = {
slope = -7654321,
npinset = 6311712,
pins = {
<std::_Vector_base<double,std::allocator<double> >> = {
_M_impl = {
<std::allocator<double>> = {
<__gnu_cxx::new_allocator<double>> = {<No data fields>},

_M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0
}
}, <No data fields>}
},
pipomodel = {
px = 0x602960,
pn = {
pi_ = 0x6029b0
}
}
}

Everything looks good except, npinset has a garbage value. Is there
something I am not understanding about POD initialization? Something
in my code that is preventing npinset to be initialized to 0? Any
clarification is appreciation.

I have not read you code so I don't know where you put your PODs but
they are only initialized to 0 if they are static or global (and
probably one more that I missed) but not on the stack or heap.
 
V

Victor Bazarov

pallav said:
I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());

#define DELAY_VALUE_NOT_GIVEN -7654321.0

typedef boost::shared_ptr<struct PinDelay> PinDelayPtr

struct DelayTime
{
double rise;
double fall;

DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay
{
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;

PinDelay();

PinDelay::pinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable
{
double slope;
unsigned int npinset;
std::vector<double> pins;
};

The struct above is not a POD-struct. It contains a 'vector',
which is non-POD. When an object of this struct is default-
initialised, each member is default-initialised. For the 'pins'
vector it means to default-initialise (invoke the constructor),
for built-ins it means to NOT initialise.
struct DelayCircuitImpl
{
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::pinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()

I don't see this class anywhere.
: dc(new DelayCircuitImpl())
{

If you look at 'dc->wltable' _right_here_, what would it be?
I would say that both 'slope' and 'npinset' would have garbage.
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}

Since the struct contain POD (plain old data), I would think they
should be initialized to 0.
No.

However, I am not sure why the variable
'npinset' does not get a default value of 0.

It's not supposed to. Add a constructor to your 'DelayCircuitImpl'
_and_ to 'DelayWireLoadTable'.
In my gdb output, I have
the following:
gdb) p *(*dc).dc
$4 = {
defarr = {
rise = -7654321,
fall = -7654321
},
defreq = {
rise = -7654321,
fall = -7654321
},
wltable = {
slope = -7654321,
npinset = 6311712,
pins = {
<std::_Vector_base<double,std::allocator<double> >> = {
_M_impl = {
<std::allocator<double>> = {
<__gnu_cxx::new_allocator<double>> = {<No data fields>},

_M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0
}
}, <No data fields>}
},
pipomodel = {
px = 0x602960,
pn = {
pi_ = 0x6029b0
}
}
}

Everything looks good except, npinset has a garbage value. Is there
something I am not understanding about POD initialization? Something
in my code that is preventing npinset to be initialized to 0? Any
clarification is appreciation.

How about this:
------------------------------
#include <vector>
struct A {
int a;
std::vector<int> vi;
};

#include <iostream>
struct B {
A *pa;
B() : pa(new A()) {
std::cout << pa->a << ' ' << pa->vi.size() << std::endl;
}
};

int main() {
B b;
}
 
B

BobR

pallav wrote in message...
I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());
#define DELAY_VALUE_NOT_GIVEN -7654321.0
typedef boost::shared_ptr<struct PinDelay> PinDelayPtr

struct DelayTime {
double rise;
double fall;
DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay {
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;
PinDelay();
PinDelay::pinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable {
double slope;
unsigned int npinset;
std::vector<double> pins;

// 'npinset' isn't used in the code you showed. Either remove it, or init
it.
DelayWireLoadTable() : slope(0.0), npinset(0){}
// or, see below...
};

struct DelayCircuitImpl {
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall
(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::pinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload
(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
: dc(new DelayCircuitImpl()) {
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));

// OR here, if you don't want a Ctor (for POD struct):
dc->wltable.npinset = 0;
[snip]
 
P

pallav

The struct above is not a POD-struct. It contains a 'vector',
which is non-POD. When an object of this struct is default-
initialised, each member is default-initialised. For the 'pins'
vector it means to default-initialise (invoke the constructor),
for built-ins it means to NOT initialise.
If you look at 'dc->wltable' _right_here_, what would it be?
I would say that both 'slope' and 'npinset' would have garbage.

Yes I see it now. Since it is allocating from the heap it is not
initialized and hence contains garbage.
No.

It's not supposed to. Add a constructor to your 'DelayCircuitImpl'
_and_ to 'DelayWireLoadTable'.

Right I understand now.
How about this:
------------------------------
#include <vector>
struct A {
int a;
std::vector<int> vi;

};

#include <iostream>
struct B {
A *pa;
B() : pa(new A()) {
std::cout << pa->a << ' ' << pa->vi.size() << std::endl;
}

};

int main() {
B b;}

Yes, it does.

Many thanks for the time/help everybody.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top