zer*_*s00 7 c++ initialization undefined const-cast undefined-behavior
根据我的小测试,这段代码可行.但是,它有未定义的行为吗?通过使用const_cast修改const对象导致我之前测试中的运行时访问违规,但我不记得它们是如何不同的.那么,这里根本没有错吗?
// test.h
#pragma once
#include <boost/array.hpp>
typedef boost::array<int,100000> bigLut_t;
extern const bigLut_t constBigLut;
Run Code Online (Sandbox Code Playgroud)
// test.cpp
#include "test.h"
bigLut_t& initializeConstBigLut()
{
bigLut_t* pBigLut = const_cast<bigLut_t*>( &constBigLut );
for(int i = 0; i < 100000; ++i) {
pBigLut->at(i) = i;
}
return const_cast<bigLut_t&>(constBigLut);
}
const bigLut_t constBigLut = initializeConstBigLut();
Run Code Online (Sandbox Code Playgroud)
// const_test.cpp
#include <iostream>
#include "test.h"
void main()
{
for(int i = 0; i < 100; ++i) {
std::cout << constBigLut[i] << std::endl;
}
system("pause");
}
Run Code Online (Sandbox Code Playgroud)
(请注意,sizeof(bigLut_t)太多而无法放入堆栈.)
编辑:我实际上喜欢ybungalobill的小评论中的想法最适合初始化这些大对象的方法:
// test.h
#pragma once
#include <boost/array.hpp>
extern const struct BigLut : public boost::array<int,100000> {
BigLut();
} constBigLut;
Run Code Online (Sandbox Code Playgroud)
// test.cpp
#include "test.h"
const BigLut constBigLut;
BigLut::BigLut()
{
for(int i = 0; i < 100000; ++i) {
this->at(i) = i;
}
}
Run Code Online (Sandbox Code Playgroud)
您修改定义为const的对象.无论何时进行,无论是否在初始化期间,它仍然是未定义的行为.仅当const指针是在某个早期阶段从该对象的非const指针获取时,才定义使用const_cast删除constness.那不是你的情况.
你能做的最好的事情是
const bigLut_t& initializeConstBigLut()
{
static bigLut_t bigLot;
for(int i = 0; i < 100000; ++i) {
bigLut.at(i) = i;
}
return bigLut;
}
const bigLut_t constBigLut = initializeConstBigLut();
Run Code Online (Sandbox Code Playgroud)
并希望编译器将优化静态临时.
| 归档时间: |
|
| 查看次数: |
376 次 |
| 最近记录: |