在C语言中,编译器/链接器是否必须将多次使用的相同字符串文字放入单个内存位置?
$compArray = (Get-ADComputer -Filter *).Name
$Proc = foreach ($strComputer in $compArray) {
Get-WMIObject -Class Win32_Service -ComputerName $strComputer |
Where-Object {
$_.Name -like 'SQL*' -or
$_.Name -like 'MSSQL*' -or
$_.Name -like 'OLAP*' -or
$_.Name -like 'MSDTS*' -or
$_.Name -like 'MSOLAP*' -or
$_.Name -like 'ReportServer*'
} |
Select-Object -Property @{Name = 'Computer';Expression={$strComputer}}, Name, State |
Sort-Object -Property Name |
Format-Table -AutoSize
}
$Proc
# Results
Computer Name State
-------- ---- -----
LABSQL01 MSSQLFDLauncher Running
LABSQL01 MSSQLSERVER Running
LABSQL01 SQLBrowser Stopped
LABSQL01 SQLSERVERAGENT Running
LABSQL01 SQLTELEMETRY Running
LABSQL01 SQLWriter Running
Computer Name State
-------- ---- -----
LABWSM01 MSSQL$MICROSOFT##WID Stopped
在这种情况下,上面的语句是否总是正确(在MSVC 2017中是),还是通常是未定义的行为?
是否可能在const char* a = "abcdef";
const char* b = "abcdef";
//Compare pointers
if (a == b) {
printf("True\r\n");
} else {
printf("False\r\n");
}
个不同的存储位置中有字符串文字abcdef
?当然,我不计算像2
这样的字符串,其中12abcdefgh
是字符串的一部分,但是是独立的。
答案 0 :(得分:2)
这里要比较的是字符串文字的 pointers 。字符串文字是静态分配在某些不应写入的内存中的。一个优化的编译器可能仅分配相同的字符串文字一次,因为它假定这些文字不会改变,并且没有多于一个副本的意义,这就是您在这里所观察到的。但这不能保证。
答案 1 :(得分:1)
这是未指定的行为,但是大多数编译器会对此进行优化以使其为真。如果要使用特定的编译器进行编码,则可能会找到一个开关或#pragma
来控制折叠此类字符串,从而为您提供确定性。