小编sbi*_*sbi的帖子

理解32位C编译器中的sizeof(char)

(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似乎对我对概念的理解得出了结论!

c c++ sizeof

11
推荐指数
3
解决办法
2万
查看次数

string.Join需要采用数组而不是IEnumerable的原因是什么?

正如标题所说:为什么string.Join需要采用数组而不是IEnumerable?这让我很烦,因为当我需要从LINQ表达式的结果创建一个连接字符串时,我必须添加一个.ToArray().

我的经验告诉我,我在这里遗漏了一些明显的东西.

c#

10
推荐指数
2
解决办法
308
查看次数

构造函数返回什么?

我的问题是构造函数返回了什么?这个问题与"构造函数的返回类型是什么?"没有什么不同.我在某处读过一个构造函数隐式返回一个完整的对象(即隐式返回类型是类的名称),但不应该明确指定.

struct empty{};

int main(){
   empty(); //creates a temporary and implicitly a constructor is called
}
Run Code Online (Sandbox Code Playgroud)

因此,根据我的解释,隐式返回类型应该是类的名称,在本例中empty.我的狂野解释是否正确?

c++ constructor return-type

10
推荐指数
2
解决办法
2万
查看次数

为什么ostringstream比ofstream更快

要将许多数据写入文件,我有两种方法:

  1. 直接写入ofstream流

    ofstream file("c:\\test.txt");
    for (int i = 0; i < 10000; ++i)
    {
        file << data[i];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 首先写入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 - 作为缓冲区,它们都应该驻留在内存中,因此应该没有区别.

引擎盖下有什么区别?

c++ iostream filestream

10
推荐指数
2
解决办法
3679
查看次数

如何在编译时从类型创建静态字符串

我有一堆有名字的类型.(它们有更多功能,但为了讨论起见,只有名称是相关的.)这些类型及其名称是在编译时使用宏设置的:

#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)

代码在这里归结为它可能包含错误的程度,但实际上这很好用.

除了它在运行时创建然后复制相当长的字符串,这些字符串表示在编译时实际上是众所周知的类型.由于这是一个在嵌入式设备上运行的性能相当敏感的代码,我想改变这一点

  1. 列表的字符串理想地是在编译时创建的,或者,如果没有办法在运行时创建它,并且
  2. 我只需要复制一个指向C字符串的指针,因为根据#1,字符串在内存中是固定的.
  3. 这与C++ 03一起编译,我们现在一直坚持使用它.

我怎样才能做到这一点?

(如果这扩大了可用于此的脏技巧:foo只能通过代码创建和读取对象的foo_list名称,并且只有名称字符串应该是人类可读的.)

c++ templates template-meta-programming

10
推荐指数
1
解决办法
1840
查看次数

寻找boost的变换迭代器的复合特征模式

那个设定

如果你想让迭代器在返回之前与它们迭代的东西一起旋转,那就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_first
  • iterator_transform_traits_map_second
  • iterator_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++ boost traits c++03

10
推荐指数
1
解决办法
270
查看次数

对象如何在C++中存储在内存中?

对象如何在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++ memory memory-management pod

9
推荐指数
2
解决办法
1万
查看次数

为什么std :: basic_ios会重载一元逻辑否定运算符?

C++ IO流的基类std::basic_ios定义operator void*()为返回!fail()operator!()返回fail().这让我想知道为什么我们需要它operator!().当然,!is也可以通过隐式调用operator void*()和否定其结果来工作.

我在这里遗漏了什么,还是纯粹出于历史原因而std::basic_ios::operator!()定义的?

一个在comp.lang.c ++的问题.主持并没有带来任何答案要么.

c++

9
推荐指数
1
解决办法
504
查看次数

在使用模板时得到"不能出现在常量表达式中"

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)

c++ parameters templates non-type

9
推荐指数
2
解决办法
4万
查看次数

具有重复名称的类模板?

是否可以定义两个具有相同名称的不同模板(按模板参数数量)?

这是我想要做的:

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++ templates

9
推荐指数
3
解决办法
311
查看次数