我已经看过它多次断言现在C++标准不允许使用以下代码:
int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
Run Code Online (Sandbox Code Playgroud)
&array[5]
在这种情况下是合法的C++代码吗?
如果可能的话,我想要一个参考标准的答案.
知道它是否符合C标准也很有趣.如果它不是标准的C++,为什么决定做出从不同的治疗呢array + 5
还是&array[4] + 1
?
在我写自己之前,我会问你们所有人.
我正在寻找一个几乎完全像STL向量的C++类,但是将数据存储到堆栈中的数组中.某种类型的STL分配器类也可以工作,但我试图避免任何类型的堆,甚至是静态分配的每线程堆(尽管其中一个是我的第二选择).堆栈效率更高.
它需要几乎替代使用向量的当前代码.
对于我自己要写的东西,我在考虑这样的事情:
char buffer[4096];
stack_vector<match_item> matches(buffer, sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)
或者类可以在内部分配缓冲区空间.然后它看起来像:
stack_vector<match_item, 256> matches;
Run Code Online (Sandbox Code Playgroud)
我认为如果空间不足,它会抛出std :: bad_alloc,尽管这不应该发生.
更新
使用Chromium的stack_container.h效果很好!
我之所以没想过这样做的原因是我总是忽略了STL集合构造函数的allocator对象参数.我已经使用了几次模板参数来做静态池,但是我从未见过代码或编写任何实际使用过对象参数的代码.我学到了新东西.很酷!
代码有点乱,由于某种原因,GCC强迫我将分配器声明为实际项而不是将其构造为vector的allocator参数.它来自这样的事情:
typedef std::pair< const char *, const char * > comp_list_item;
typedef std::vector< comp_list_item > comp_list_type;
comp_list_type match_list;
match_list.reserve(32);
Run Code Online (Sandbox Code Playgroud)
对此:
static const size_t comp_list_alloc_size = 128;
typedef std::pair< const char *, const char * > comp_list_item;
typedef StackAllocator< comp_list_item, comp_list_alloc_size > comp_list_alloc_type;
typedef std::vector< comp_list_item, comp_list_alloc_type > comp_list_type;
comp_list_alloc_type::Source match_list_buffer;
comp_list_alloc_type match_list_alloc( &match_list_buffer );
comp_list_type match_list( match_list_alloc );
match_list.reserve( comp_list_alloc_size ); …
Run Code Online (Sandbox Code Playgroud) 有没有办法在初始化时用c ++创建一个说256个字符的字符串?
我的部分工作要求我"1.创建一个256个字符的字符串.重复使用你的名字."
除了使用循环之外,我不太清楚如何做到这一点,但我觉得有一种更简单的方法.
我最近尝试在Go中附加两个字节的数组切片,并遇到了一些奇怪的错误.我的代码是:
one:=make([]byte, 2)
two:=make([]byte, 2)
one[0]=0x00
one[1]=0x01
two[0]=0x02
two[1]=0x03
log.Printf("%X", append(one[:], two[:]))
three:=[]byte{0, 1}
four:=[]byte{2, 3}
five:=append(three, four)
Run Code Online (Sandbox Code Playgroud)
错误是:
cannot use four (type []uint8) as type uint8 in append
cannot use two[:] (type []uint8) as type uint8 in append
Run Code Online (Sandbox Code Playgroud)
考虑到Go的切片所谓的稳健性应该不是问题:
http://code.google.com/p/go-wiki/wiki/SliceTricks
我做错了什么,我应该如何添加两个字节数组呢?
GCC 4.4.3生成了以下x86_64程序集.令我困惑的部分是mov %eax,%eax
.将寄存器移到自身?为什么?
23b6c: 31 c9 xor %ecx,%ecx ; the 0 value for shift
23b6e: 80 7f 60 00 cmpb $0x0,0x60(%rdi) ; is it shifted?
23b72: 74 03 je 23b77
23b74: 8b 4f 64 mov 0x64(%rdi),%ecx ; is shifted so load shift value to ecx
23b77: 48 8b 57 38 mov 0x38(%rdi),%rdx ; map base
23b7b: 48 03 57 58 add 0x58(%rdi),%rdx ; plus offset to value
23b7f: 8b 02 mov (%rdx),%eax ; load map_used value to eax …
Run Code Online (Sandbox Code Playgroud) 我刚刚看到一段代码使用通用列表类以下列方式实例化自己:
var foo = new List<string>(){"hello", "goodbye"};
Run Code Online (Sandbox Code Playgroud)
在构造函数之后的花括号特别令人困惑.它让我想起了一些
var bar = new string[]{"hi","bye"};
Run Code Online (Sandbox Code Playgroud)
但在过去我会一直使用:
var foo = new List<string>(new []{"hello", "goodbye"});
Run Code Online (Sandbox Code Playgroud)
有没有人在第一行代码中找到解释语法的链接?我甚至不知道从哪里开始谷歌搜索它.
realloc引用说:
该功能可以将存储块移动到新位置,在这种情况下返回新位置.
这是否意味着如果我这样做:
void foo() {
void* ptr = malloc( 1024 );
unsigned char* cptr = ( unsigned char* )ptr+256;
ptr = realloc( ptr, 4096 );
}
Run Code Online (Sandbox Code Playgroud)
那么如果realloc移动块,cptr可能会变为无效?
如果是,那么以任何方式重新分配信号,它将移动块,以便我可以做一些事情来防止cptr变得无效?
据我所知,在C++ 11之前,字符串文字在C和C++之间几乎完全相同.
现在,我承认C和C++在处理宽字符串文字方面存在差异.
我能找到的唯一区别在于通过字符串文字初始化数组.
char str[3] = "abc"; /* OK in C but not in C++ */
char str[4] = "abc"; /* OK in C and in C++. Terminating zero at str[3] */
Run Code Online (Sandbox Code Playgroud)
技术差异只在C++中很重要.在C++ "abc"
中const char [4]
,它在C中char [4]
.然而,C++有一个特殊的规则,允许转化为const char *
然后char *
保留C兼容性直至C++ 11不再施加特殊规则时.
文字允许长度的差异.但是,实际上,编译C和C++代码的任何编译器都不会强制执行较低的C限制.
我有一些有趣的链接适用:
还有其他差异吗?
假设进程正在共享内存中创建互斥锁并锁定它并在互斥锁被锁定时转储核心.
现在在另一个过程中,如何检测互斥锁已被锁定但不属于任何进程?
我编写了一个挂钩库,用于检查PE可执行文件dll导入表,以创建一个可以更改参数和返回值的库.关于如何从函数传递返回值,我有几个问题.
我了解到函数的返回值保存在累加器寄存器中.总是这样吗?如果没有,编译器如何知道在哪里查找函数结果?
返回类型大小怎么样?一个整数很容易适合,但更大的结构怎么样?调用者是否保留堆栈空间,以便它调用的方法可以将结果写入堆栈?