Re: POD initialization
pallav wrote:
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>},
<No data fields>},
members of std::_Vector_base<double,std::allocator<double>
_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;
}
-----------------------------
It should print something non-zero and then 0.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask