(sizeof)char总是在32位GCC编译器中返回1.
但由于32位编译器的基本块大小为4,当基本大小为4字节时,char如何占用单个字节?
考虑以下因素:
struct st
{
int a;
char c;
};
Run Code Online (Sandbox Code Playgroud)
sizeof(st)返回为8,默认块大小为4字节(因为分配了2个块)
我永远无法理解为什么sizeof(char)在分配大小为4的块时返回为1.
有人可以解释一下吗???
我会非常感谢任何回复解释它!
编辑:'bits'的拼写错误已更改为'bytes'.我对第一次编辑的人抱歉.我回滚了编辑,因为我没有注意到你做的改变.感谢所有那些指出必须改变的人,尤其是@Mike Burton,因为他们对这个问题进行了抨击,并且@jalf似乎对我对概念的理解得出了结论!
正如标题所说:为什么string.Join需要采用数组而不是IEnumerable?这让我很烦,因为当我需要从LINQ表达式的结果创建一个连接字符串时,我必须添加一个.ToArray().
我的经验告诉我,我在这里遗漏了一些明显的东西.
我的问题是构造函数返回了什么?这个问题与"构造函数的返回类型是什么?"没有什么不同.我在某处读过一个构造函数隐式返回一个完整的对象(即隐式返回类型是类的名称),但不应该明确指定.
struct empty{};
int main(){
empty(); //creates a temporary and implicitly a constructor is called
}
Run Code Online (Sandbox Code Playgroud)
因此,根据我的解释,隐式返回类型应该是类的名称,在本例中empty.我的狂野解释是否正确?
要将许多数据写入文件,我有两种方法:
直接写入ofstream流
ofstream file("c:\\test.txt");
for (int i = 0; i < 10000; ++i)
{
file << data[i];
}
Run Code Online (Sandbox Code Playgroud)首先写入istringstream,然后立即写入ofstream
ostringstream strstream;
for (int i = 0; i < 10000; ++i)
{
strstream << data[i];
}
ofstream file("c:\\test.txt");
file << strstream.str();
Run Code Online (Sandbox Code Playgroud)毫不奇怪,第二种方法更快,事实上,它比我的HP7800机器上的第一种方法快4倍.
但为什么?我知道ofstream正在使用filebuf,而ostringstream正在使用stringbuf - 作为缓冲区,它们都应该驻留在内存中,因此应该没有区别.
引擎盖下有什么区别?
我有一堆有名字的类型.(它们有更多功能,但为了讨论起见,只有名称是相关的.)这些类型及其名称是在编译时使用宏设置的:
#define DEFINE_FOO(Foo_) \
struct Foo_ : public foo_base<Foo_> { \
static char const* name() {return #Foo_;} \
}
Run Code Online (Sandbox Code Playgroud)
然后将这些类型组合在编译时列表(经典的简单递归编译时列表)中,我需要通过连接其对象的名称来创建列表的名称:
template<class Foo, class Tail = nil>
struct foo_list {
static std::string name_list() {return Foo::name() + "-" + Tail::name();}
};
template<class Foo>
struct foo_list<Foo,nil> {
static std::string name_list() {return Foo::name();}
};
Run Code Online (Sandbox Code Playgroud)
代码在这里归结为它可能包含错误的程度,但实际上这很好用.
除了它在运行时创建然后复制相当长的字符串,这些字符串表示在编译时实际上是众所周知的类型.由于这是一个在嵌入式设备上运行的性能相当敏感的代码,我想改变这一点
我怎样才能做到这一点?
(如果这扩大了可用于此的脏技巧:foo只能通过代码创建和读取对象的foo_list名称,并且只有名称字符串应该是人类可读的.)
如果你想让迭代器在返回之前与它们迭代的东西一起旋转,那就boost::transform_iterator非常好了.你传递一个一元函数,它转换底层迭代器的结果,operator*()然后转换迭代器返回:
template<typename Map>
struct iterator_transform_traits_map_second {
typedef typename Map::value_type value_type;
typedef typename Map::mapped_type result_type;
result_type& operator()( value_type& v) const {return v.second;}
const result_type& operator()(const value_type& v) const {return v.second;}
};
typedef
boost::transform_iterator<iterator_transform_traits_map_second>
transformed_iterator;
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但.
你的同事喜欢这个闪亮的新工具,并且也开始使用它,很快就会有人收集你们目前为止所提出的内容.这是我们的:
iterator_transform_traits_map_firstiterator_transform_traits_map_seconditerator_transform_traits_map_deref (取消引用任何容器的条目)iterator_transform_traits_map_deref_second(取消引用地图条目second)iterator_transform_traits_map_dynamic_cast(执行dynamic_cast<>()任何容器的输入)iterator_transform_traits_map_any_second(执行any_cast<>()地图条目second)当然,这留下了许多有用的(因为还没有人需要它们),并且它根本不能扩展.我的任务是编写一个迭代器来取消引用地图条目second并执行一个dynamic_cast<>(),我是谁,我被拒绝只是添加一个iterator_transform_traits_map_dynamic_cast_deref_second并继续前进.
相反,我试图写一些基本特征和编译时组成特征,允许将其中几个命名为模板参数,并简单地管理调用.理想情况下,我想要这样的东西:
typedef
boost::transform_iterator<
iterator_transform_traits< iter_transf_tr_second
, iter_transf_tr_deref …Run Code Online (Sandbox Code Playgroud) 对象如何在C++中存储在内存中?
对于常规课程,如
class Object
{
public:
int i1;
int i2;
char i3;
int i4;
private:
};
Run Code Online (Sandbox Code Playgroud)
使用Object作为数组的指针可以用来访问i1如下?
((Object*)&myObject)[0] === i1?
Run Code Online (Sandbox Code Playgroud)
关于SO的其他问题似乎暗示将结构转换为指针将指向POD类型的第一个成员.如果有构造函数的类,这有什么不同?另外,对于非POD类型,它有何不同?
编辑:
因此,在记忆中,上述课程的布局如下:
[i1 - 4bytes][i2 - 4bytes][i3 - 1byte][padding - 3bytes][i4 - 4bytes]
Run Code Online (Sandbox Code Playgroud) C++ IO流的基类std::basic_ios定义operator void*()为返回!fail()和operator!()返回fail().这让我想知道为什么我们需要它operator!().当然,!is也可以通过隐式调用operator void*()和否定其结果来工作.
我在这里遗漏了什么,还是纯粹出于历史原因而std::basic_ios::operator!()定义的?
一个在comp.lang.c ++的问题.主持并没有带来任何答案要么.
template < int >
class CAT
{};
int main()
{
int i=10;
CAT<(const int)i> cat;
return 0; //here I got error: ‘i’ cannot appear in a constant-expression
}
Run Code Online (Sandbox Code Playgroud)
甚至
int i=10;
const int j=i;
CAT<j> cat; //this still can not work
Run Code Online (Sandbox Code Playgroud)
但我已将我转换为const int,为什么编译器仍报告错误?
我的平台是ubuntu,gcc版本4.4.3
谢谢,
==============
谢谢你的输入,但在某些情况下,我需要一个非const变量,
例如:
//alloperations.h
enum OPERATIONS
{
GETPAGE_FROM_WEBSITE1,
GETPAGE_FROM_WEBSITE2,
....
};
template< OPERATIONS op >
class CHandlerPara
{
static string parameters1;
static string parameters2;
....
static void resultHandler();
};
//for different operations,we need a different …Run Code Online (Sandbox Code Playgroud) 是否可以定义两个具有相同名称的不同模板(按模板参数数量)?
这是我想要做的:
namespace MyNamespace
{
template<class TRet>
class FunctionObject
{
typedef typename TRet ReturnType;
virtual ReturnType const operator()() const = 0;
};
template<class TRet, class TArg0>
class FunctionObject
{
typedef typename TRet ReturnType;
typedef typename TArg0 FirstArgumentType;
virtual ReturnType const operator()(FirstArgumentType const &arg) const = 0;
};
}
Run Code Online (Sandbox Code Playgroud)
我在第二个FunctionObject结构定义的右括号末尾提到了太多模板参数的错误.
我知道这可以在C#中完成,但对C++不确定.有人可以在这里说清楚吗?
c++ ×9
templates ×3
boost ×1
c ×1
c# ×1
c++03 ×1
constructor ×1
filestream ×1
iostream ×1
memory ×1
non-type ×1
parameters ×1
pod ×1
return-type ×1
sizeof ×1
traits ×1